1 代码演练 1.1 代码演练1(未使用装饰者模式) 1.2 代码演练2(使用装饰者模式) 1 代码演练 1.1 代码演练1(未使用装饰者模式) 需求: 大妈下班卖煎饼,加一个鸡蛋加一元,一个火腿两元,现在a买一个煎饼,b买加蛋的煎饼,c买加肠加蛋的煎饼,请实现它 煎饼类: package com.geely.design.pattern.structural.decorator.v1; /** * 创建煎饼类 */ public class BatterCake { /** * 获取加的种类…
1 代码演练 1.1 代码演练1 1 代码演练 1.1 代码演练1 需求: 每周由随机部门经历做报告: 重点关注: a 该案例是单例模式和享元模式共同使用 b 外部传入的department是外部状态,如果是Manager内部定义一个属性String类型的ManagerTitile,那么无论外部传过来的部门如何变化,这个ManagerTitile不会变化,这个ManagerTitile 称之为内部状态 uml类图: 员工工厂类: package com.geely.design.pattern.…
1 代码演练 1.1 代码演练1(组合模式1) 1.2 代码演练2(组合模式1之完善) 1 代码演练 1.1 代码演练1(组合模式1) 需求: 打印出木木网的课程结构, 我们用一个组建类作为接口,课程类和目录类继承. uml: 组件类: package com.geely.design.pattern.structural.composite; import java.io.IOException; /** * 课程目录组件,可以被课程和课程目录继承 */ public abstract cla…
1 代码演练 1.1 建造者模式演练 1.2 静态内部类演练建造者模式(链式调用) 1 代码演练 1.1 建造者模式演练 需求: 根据讲师提供的课程名称,课程ppt,课程视频,课程手记,课程问答 制作教学课程. 重点: 教练类coach.java标红部分,builder设值,然后赋值(看test.java). uml类图: 测试类: package com.geely.design.pattern.creational.builder; public class Test { public st…
1 代码演练 1.1 代码演练1 1.2 代码演练2(后端课程子类运用钩子方法,加入写手记的方法) 1.3 代码演练3(前端有多个子类,有得需要写手记,有得不需要写,如何实现?) 1 代码演练 1.1 代码演练1 目的: 木木网制作课程视频父类,前端课程子类和设计模式子类.父类需要制作PPT,制作视频,制作手记,包装课程四个部分,且步骤基本一致,其中制作PPT和制作视频都一致,前端子类和后端子类包装课程方法不一样. uml类图: 测试类: package com.geely.design.pat…
之前一直都是按照书的结构顺序做总结,觉得好像不是很好,现在试着完全按照自己的理解做总结.例子还是书上的例子. 一:组合模式的作用: 在web开发中,主要用于创建嵌套的html结点,使得我们方便的把各种结点连接起来,并且提供简易的操作.   二:组合模式的结构: 结构就像我们的文件结构一样讲Composite理解为文件夹,Leaf理解为文件就好理解了.   三:例子一,创建一个组合的表单 需求:试想着我们想要构建一个表单,但是表单域经常要被产品经理修改,我们怎样才能利用js快速的搭建这个form呢…
组合模式(Composite Pattern): 组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构.组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式. 角色模式与结构: 组合模式的关键是定义了一个抽象构件类,它既可以代表叶子,又可以代表容器,而客户端针对该抽象构件类进行编程,无须知道它到底表示的是叶子还是容器,可以对其进行统一处理. 示例代码: using System; using System…
Android中对组合模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用.在android UI设计,几乎所有的widget和布局类都依靠这两个类.组合模式,Composite Pattern,是一个非常巧妙的模式.几乎所有的面向对象系统都应用到了组合模式. 1.意图将对象View和ViewGroup组合成树形结构以表示"部分-整体"的层次结构(View可以做为ViewGroup的一部分).组合模式使得用户对单个对象View和组合对象ViewGroup的使…
1:应用场景 Android中对组合模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用.在android UI设计,几乎所有的widget和布局类都依靠这两个类.组合模式,Composite Pattern,是一个非常巧妙的模式.几乎所有的面向对象系统都应用到了组合模式. 2:意图 将对象View和ViewGroup组合成树形结构以表示"部分-整体"的层次结构(View可以做为ViewGroup的一部分).组合模式使得用户对单个对象View和组合对象Vie…
1 代码讲解 1.1 抽象工厂优点 1.2 抽象工厂缺点 1.3 为何有产品族的业务场景宜用抽象工厂设计模式?而不是工厂设计模式? 2 代码演练 2.1 抽象工厂代码演练 1 代码讲解 1.1 抽象工厂优点 a 应用层代码不和具体的产品发生依赖,只和具体的产品族工厂发生依赖关系,低耦合,高内聚. b 从具体的产品工厂取出来的肯定是同一产品族,开发的时候逻辑清晰.(ab其实可以归为1点) c 对于产品族来说,符合开闭原则,增加新的产品族的时候,对扩展开放 1.2 抽象工厂缺点 a 增加新的产品时候…
1 代码演练 1.1 代码演练1(迭代器模式演练) 1.2 代码使用场景 1 代码演练 1.1 代码演练1(迭代器模式演练) 需求: 课程管理:需要实现课程可进行增添,删除,并能够打印出课程列表. uml类图: 测试类: package com.geely.design.pattern.behavioral.iterator; public class Test { public static void main(String [] args){ //新增6个课程 Course course1…
1 课堂讲义 1.1 产品等级和产品簇 2 代码演练 2.1 工厂方法代码演练 1 课堂讲义 1.1 产品等级和产品簇 工厂方法是为了解决同一产品等级的业务抽象问题 抽象工厂方法是为了解决同一产品簇的问题 产品等级: 相同类型的产品为同一产品等级. 比如:汽车有大众汽车,长安汽车,奥迪汽车等.长安汽车和奥迪汽车,大众汽车属于同一产品等级. 产品簇: 长安汽车,长安摩托车,长安自行车. 2 代码演练 2.1 工厂方法代码演练 测试类: package com.geely.design.patter…
1 要点讲解 1.1 需要注意 2 代码演练 2.1 类的单一职责原则demo 2.2 接口的单一职责原则demo 2.3 方法的单一职责原则demo 1 要点讲解 1.1 需要注意 1.1.1 实际应用中,类不采用单一职责,接口和方法采用单一职责.1.1.2 定义:单一职责规定 一个类,接口或者方法,只有一个变化的原因1.1.3 优点:降低类的复杂性,提高可读性,维护时风险降低1.1.4 实际应用,受依赖,组合,聚合这些关系影响,同时受控于项目规模,项目周期,技术人员水平,对进度把控等影响.适…
1 代码演练 1.1 代码演练1 1 代码演练 1.1 代码演练1 需求: 网站笔记需要存储快照,能实现回退的功能. 注意: a 设计的时候,可以分为笔记类,笔记快照类和 笔记快照管理类  三个类. b 笔记快照管理 和 笔记快照是聚合关系,快照管理可以有0到多个笔记快照. c 快照管理类用栈的方式存储快照,先进后出,后进先出. uml类图:(右边是测试类) 测试类: package com.geely.design.pattern.behavioral.memento; /** * Creat…
1 内容简析(易错加粗) 2 uml类图展示 1 内容简析(易错加粗) 1.1 设计模式中的对象关系 依赖关系 虚线箭头 组合关系 实心菱形 聚合关系 空心菱形(想象成盘子,盛东西,盘子的多,另一方少) 关联关系 实线  类与类的连接,(它使一个类知道另一个类的属性和方法,关联关系一般用成员变量实现) 继承 空心三角形实线 实现 空心三角形虚线 1.2 其他需要注意的地方 实现接口有两种方式,一种是棒棒糖的形式,另一种是虚线空心三角形的方式 2 uml类图展示…
1 课堂概念 1.0 继承关系的选择 1.1 起名 1.2 定义 1.3 组合聚合优缺点 1.4 继承优缺点 1.5 组合聚合区别 2 代码演练 2.1 反例 2.2 正例 3 疑问解答3.1 疑问解答 1 课堂概念 1.0 继承关系的选择(自己理解) 搜索,官方解答,说继承关系是is a的关系,在我看来,正方形is a 长方形,详看3.1解答和上节的案例. 所以看是否有继承关系,通常要看子类和父类共用的方法,子类是否能够实现实现父类的方法.(自己理解) 1.1 起名 合成复用原则,组合复用原则…
1 代码演练 1.1 继承关系判别(是否是真正意义的继承) 1.2 入参控制 1.3 出参控制 1 代码演练 1.1 继承关系判别(是否是真正意义的继承)(其实我觉得这个例子有点牵强) 1.1.1 反例 结论: 确定继承关系的时候一定要判断好,是否父类的方法子类可以继承.传统意义的正方形是矩形的子类,在这里是不适用的. 测试类1: package com.geely.design.principle.liskovSubstitutation; public class TestSquare {…
1 课程讲解 1.1 定义 1.2 特质 1.3 重点 2 代码演练 2.1 反例 2.2 正例 1 课程讲解 1.1 定义 定义:一个对象应该对其他对象保持最少的了解.又叫最少知道原则. 1.2 特质 核心:降低类的耦合 优点:降低类的耦合 1.3 重点 只和朋友交流,不和陌生人说话 朋友:出现在成员变量.方法的输入.输出参数中的类称为成员朋友类,而出现在方法体内部的类不属于朋友类. 2 代码演练 2.1 反例 测试类: package com.geely.design.principle.d…
1 主讲内容 1.1 核心内容 1.2 优点 1.3 课程记录 2 代码演练 2.1 接口隔离原则反比 2.2 接口隔离原则正比 1 主讲内容 1.1 核心内容 总结:细粒度可以进行再组装,粗粒度不可再拆分,所以接口设计的时候尽可能适度的拆分 1.2 优点 ◆优点:符合我们常说的高内聚低耦合的设计思想从而使得类具有很好的可读性.可扩展性和可维护性 1.3 课程记录 ◆定义:用多个专门的接口,而不使用单一的总接口,客户端不应该依赖它不需要的接口◆一个类对一个类的依赖应该建立在最小的接口上建立单一接…
1 课程讲解 1.1 定义 1.2 优点 1.3 细节描述 2 代码演练 2.0 代码展示优点 2.1 非面向接口编程 2.2 面向接口编程1 传参 2.3 面向接口编程2 构造函数 2.4 面向接口编程3 set方法 1 课程讲解 1.1 定义 ◆定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象 1.2 优点 ◆优点:降低耦合,提高内聚,增强代码的可维护性. 1.3 细节描述◆抽象不应该依赖细节:细节应该依赖抽象◆针对接口编程,不要针对实现编程 每个类尽量实现接口或者抽象类,或者继承抽象…
1 课程讲解 1.1 开闭原则定义 1.2 不重要内容 2 代码coding 2.1 基类 2.2 需求:打印出原价和折扣后的价格.(接口不应该随意变化,面向接口编程) 1 课程讲解 1.1 开闭原则定义 一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 1.2 不重要内容 (抽象构建框架,实现扩展细节) 2 代码coding 2.1 基类 测试类: package com.geely.design.principle.openclose; public class TestJavaCo…
1 代码演练 1.1 代码演练1(一对一观察) 1.2 代码演练2(一对多观察) 1.3 代码演练3(多对多观察) 1 代码演练 1.1 代码演练1(一对一观察) 需求: 木木网课程系统,教师后台提醒功能,当对应课程收到提问时,系统能给对应教师发出提醒 注意: a 设计的时候,可以分为教师类,课程类和问题类.课程类作为被观察者,教师类作为观察者,问题类作为被观察者的一个参数. b 根据系统已经有jdk提供的两个类 Observable(作为被观察者要继承的类)和 Observer(作为被观察者实…
1 课程讲解 1.1 应用场景 2 代码演练 2.1 threadLocal应用 1 课程讲解 1.1 应用场景 多线程的时候: 使用同步锁使用时间换空间的方式,(线程排队时间比较长) 而使用threadlocal使用空间换时间的方式. 基于threadlocal的单例模式,为每一个线程提供了一个对象,多线程访问的时候不会相互影响. 基于ThreadLocal的单例实现,数据库连接池的这种应用场景直接得提高了并发量,并且隔离了线程,不至于因为某一线程数据库连接断开造成全局断开,直接得提高了应用的…
1 课程讲解 1.1 为何要使用双重检查 1.2 双重检查的缺点 1.3 指令重排序讲解 1.4 指令重排序比喻(自己理解) 1.5 如何解决指令重排序问题 2 代码演练 2.1 代码演练1(双重检查  解决对象锁和类锁的问题) 2.2 代码演练2(volatile 应用:解决重排序问题) 1 课程讲解 1.1 为何要使用双重检查 在上节课的时候,多线程的时候,由于一个线程被锁,其他的线程无法访问该类,被堵塞.性能大大降低,双重检查主要是应用解决此类问题. 双重检查可以使更多的线程堵塞在方法中,…
1 代码演练 1.1 代码演练1(多态) 1.2 代码演练2(优化应用) 1.3 代码演练3(策略模式结合工厂模式) 1 代码演练 1.1 代码演练1(多态) 需求: 木木网卖课程,为了促进销售,618实行买课程立减10元,双十一实行满50减10元,还有返现的优惠(这个活动还没有开始).请实现它 uml类图: 测试类: package com.geely.design.pattern.behavioral.strategy; public class TestStrategy { public…
1 重要 1.1 类适配器和对象适配器最大的区别 2 代码演练 2.1 代码演练1(类适配器模式) 2.2 代码演练2(对象适配模式) 2.3 代码演练3(具体应用场景) 1 重要 1.1 类适配器和对象适配器最大的区别 类适配器通过继承关系达到适配的目的,而对象适配器通过组合达到适配目的. 2 代码演练 2.1 代码演练1(类适配器模式) 需求相关: a类和b类,想用b类或者b类的子类实现a类的方法 设计分析: 适配器类c继承了被适配器类a并且实现了目标类b的接口,通过适配器类c把被适配者a的…
1 主要内容 1.1 关联和依赖的对比 1.2 组合和聚合的对比 1.3 继承和实现的对比 1.4 各种关系代码实现demo 1 主要内容 1.1 关联和依赖的对比 关联是a类中存在b类对象,企鹅类中有气候类的属性 依赖是a类成员方法中有b类的属性,动物新陈代谢方法中有水和空气的属性,只有调这个方法的时候,才可能临时用一下 1.2 组合和聚合的对比 组合有相同的生命周期,鸟有翅膀,鸟死了,翅膀不复存在 大雁群有大雁,一直大雁挂了,大雁群不会消失 1.3 继承和实现的对比 实线:继承 虚线:实现…
1 代码演练 1.1 未使用简单工厂模式代码 1.2 使用简单工厂模式 1.3 使用反射机制简单工行模式 1 代码演练 1.1 未使用简单工厂模式代码 测试类: package com.geely.design.pattern.creational.simplefactory; public class Test { /** * 注:此为反例, * 没有用简单工厂模式之前,需要new对象. * @param args */ public static void main(String [] ar…
1 代码演练 1.1 代码演练1(解释器模式coding) 1.2 代码演练如何应用了解释器模式 1 代码演练 1.1 代码演练1(解释器模式coding)(该案例运用了栈的先进先出的特性) 需求: 原系统中有大量的处理计算的类:处理的规则有(a+b)*c*d+e和a/b+c-d等等数量众多方法:如果设计成coding中的类之后,直接一个类就可以搞定.提高了类的复用性,简化了代码. uml类图: 测试类: package com.geely.design.pattern.behavioral.i…
1 代码演练 1.1 代码演练1(不使用外观模式) 1.2 代码演练2(使用外观模式) 2 应用核心 2.1 核心 2.2 零碎知识点 1 代码演练 1.1 代码演练1(不使用外观模式) 需求: 木木网有积分兑换礼物的功能,设计的时候需要校验三步: a 资格校验系统,是木木网会员. b 积分系统,该系统放的是各个积分的获取支出,需要拿出该用户目前的积分和该礼物所需要的积分进行对比 c 物流系统,如果满足ab,则返回成功,并返回一个订单号. 关注点: 应用层无需知道资格校验类等其他子系统的类 UM…