设计模式 概览
本文章不讨论各个设计模式细节,而只是自己在读24种设计模式时的笔记。估计会有很多地方艰涩难懂,见谅。
一、策略模式
关键点: 赵云的main()、 锦囊 、妙计
主体赵云 new 一个特定妙计的锦囊对象,用锦囊对象operate()执行妙计。
重点就是,妙计对象是锦囊对象的成员函数。kit.operate()实际内部是用strategy.operate()。//执行接口想同
优势:高内聚低耦合,策略可以无限扩展,而锦囊却不需要变动。
二、代理模式
关键点:西门庆(嫖客)main()、王婆(老鸨)、潘金莲(妓女)
主体西门庆,new一个手底下有妓女的老鸨,老鸨procuress.papapa(),实际是被代理的妓女prostitute.papapa()。 //执行接口想同,都是papapa
重点:和策略模式类似,都是中间锦囊(王婆) 掌管很多 妓女类或妙计类
优势:主要使用java多态
三、单例模式
关键点:大臣main()、 皇帝(单例对象)
皇帝变量是静态,皇帝类构造函数是用private限制的,对外开放的静态getInstance()方法中,调用构造函数生成对象。 //补充知识点:类的构造函数都是静态的,因为是类调用,而不是对象调用。
重点:private static final Emperor emperor= new Emperor(); //改进后,避免getInstance()中的判空导致多进程下出错。final是不可修改,static表明属于类而不是对象
public synchronized static getInstance(){return emperor;} // synchronized 修饰,表明即使多线程情况下,也顺序执行该函数。
优势:保证皇帝对象唯一
四、多例模式
关键点:有限个多例,如果无限个就变成普通的对象了
private static int max_num = 5; //修饰的东西留意
private static ArrayList emperorList = new ArrayList(max_num); //这里面放对象
static{
for(int i=0; i< max_num;i++){
emperorList[i].add(new Emperor()); //往里面添加
}
}
public static Emperor getInstance(){***; return emperorList.get[i];} //对外开放用于获取对象
五、工厂模式
关键点:女娲 、造人工厂、人种
女娲main()调用造人工厂的静态方法createHuman(class c),利用Class.forName()函数的反射机制,获取对象并返回。
public static Human createHuman(class c){
human = (Human)Class.forName(c.getName()).newInstance(); //通过字符串获取类对象,经典方式
}
女娲main()调用时:Human YellowHuman = HumanFactory.createHuman( WhiteHuman.class ); //传入某个Human类,只是类,不是对象
重点:女娲main调用,factory里制造对象
六、门面模式(facade pattern) //两个字 “封装”
关键点:写信人、邮局、信件(letter)
写信人main,只要把地址和内容交给邮局对象,邮局对象会执行设置信件内容、设置地址、打包、发送等等 //实际上就是加入邮局这个中间层,封装底层
重点:复杂流程操作,要对上层透明,加入中间层目的就是如此。
优势:写信人只要声明邮局对象即可,无需关系底层操作流程,避免人为错误。
七、适配器模式(adapter pattern)
关键点:老板、内部人员系统 、外部人员系统
老板 通过内部系统查找 外部人员系统的信息,内部和外部的数据结构定义不一致,需要一个中间层。
重点:不同平台之间,构建中间层
八、模板方法(Template pattern)
关键点:客户 、悍马、悍马模板
客户main 获得一个悍马对象,悍马类继承自 抽象的悍马模板类,模板类中包括 (基本方法+模板方法),模板方法 是通过汇总或排序 基本方法 而产生的结果集。比如run()或execute()。
重点:run()这个模板方法放在父类中,子类不需要实现。如果想设置run中基本方法的实现顺序或开关,可以用hook,钩子变量。
优势:好多开源项目采用,因其扩展性好。
九、桥梁模式(bridge pattern)
关键点:老板、公司、产品
公司可以有多个子公司,一个公司可以有多种产品。方案:把产品作为公司一个属性,
重点:
优势:类间解耦,两个角色都可以自己无限扩展下去,相互不影响。解决了oop中继承特性的缺点。
2、解构技能,找出实现80%效果的那20%
3、不要一心二用
4、练习练习再练习!然后获得即时反馈
5、坚持,不要在低谷期放弃