HeadFirst设计模式总结

工作之余看了大概两个月的HeadFirst设计模式了,目前看到了第十章,书是本好书,但是实在太厚了,加上一章的内容又有很多,一边看一边忘。。。。所以还是总结一下。

第一章:策略模式,关键字:多用组合,少用继承

为什么要少用继承?每次有了新的需求,都会使代码的某一部分发生改变,那么这部分就有可能需要被抽出来,很容易造成新的错误。将两个类组合起来使用,就是组合。鸭子的行为不是通过继承来的,而是通过飞行行为类,或者叫的行为类组合起来的,使用组合可以使系统具有很大的弹性,可以在运行的时候动态改变行为。

策略模式在书中的定义:定义了算法族,分别封装起来,让他们之间可以相互替换。此模式让算法的变化独立于使用算法的客户。

第二章:观察者模式,出版者+订阅者=观察者模式a

书中定义:定义了对象之间的一对多依赖,这样依赖,当一个对象的状态改变的时候,它的所有依赖者都会收到通知并自动更新。

在这一章主要讲的是对气象站的设计,当气象测量更新的时候,通知布告板改变上面的监控数字。天气数据继承主题Subject的接口,布告板去继承观察者Observer和display的接口。布告板首先在构造方法中包含注册主题registerObserver的功能,当天气数据更新的时候,将调用主体中的notify方法去通知观察者,调用观察者的更新update接口,去更新布告板的显示数值。当然了,主题中也会包含移除观察者removeObserver的接口。

java中包含内置的观察者模式java.utile.Observable和java.util.Observer。setChange方法标记状态是否已经改变。

第三章:装饰者模式,关键字----开闭原则:对扩展开放,对修改关闭

书中定义:动态的将责任附加到对象的身上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

以星巴克咖啡为例,装饰者继承自被装饰者,装饰者(CondimentDecorator)和被装饰者(Beverage)有相同的接口。具体的咖啡类型继承自Beverage,奶泡茶等配料类型继承自CondimentDecorator。让配料去引用一个Beverage,具体做法是将饮料作为配料的构造器参数,这样就起到了用配料去装饰饮料的作用。

java中的装饰者模式:java I/O。InputSteam是抽象组件,相当于Beverage类。FileInputStream/StringBufferInputStream/ByteArrayInputStream是被装饰者包起来的具体组件  0,相当于各种口味的咖啡。FilterInputStream是一个抽象装饰者,BufferedInputStream/LineNumerInputStream就是具体的装饰者。示例:InputStream = new BufferedInputStream(new FileInputStream("text.txt"))。

第四章:工厂模式

简单工厂模式:就是我们最常用的,创建一个工厂,工厂中有一个create方法,包括多态pizza = new xxPizza,所有客户用这个方法来实例化新的对象。

工厂方法模式:

书中定义:定义了一个创建对象的接口,但子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到了子类。

引出关键字----依赖倒置原则:要依赖抽象,不要依赖具体的类。

抽象工厂模式:

书中定义:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

这两个方法实在太难描述了,用一张图表达吧。

第五章:单件模式

书中定义:确保一个类只有一个实例,并提供一个全局访问点。

其中构造器是私有的,只有自己的类才可以调用构造器去实例化对象。

改善单件模式的多线程问题:1)在静态方法上加synchronized关键字(加入应用程序可以接受同步方法造成程序执行效率下降很多的情况下,懒汉式)。2)在类加载的时候马上创建单件实例(饿汉式)。3)同步代码块在判断实例是否创建中间。

第六章:命令模式,关键字--封装调用

书中定义:将请求(在例子中就是命令)封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

如一个遥控器,首先实现一个只有一个方法execute()的命令接口,如果是打开台灯的按钮,那么就实现一个打开台灯的命令去继承命令接口。调用者(遥控器)持有命令对象,并在某个时间调用命令对象的execute方法,将请求付诸行动。

public class RemoteControlTest { //这是命令模式的客户
    public static void main(String[] args) {
        SimpleRemoteControl remote = new SimpleRemoteControl(); //遥控器是调用者
        Light light = new Light(); // 创建一个电灯对象,此对象是请求的接收者
        LightOnCommand linghtOn = new LightOnCommand(light); // 创建一个命令,将接受者传给它
        
        remote.setCommand(lightOn); // 把命令传给调用者
        remote.buttonWasPressed(); // 然后按下虚拟按钮
    }
}

命令模式还包含更多的用途,队列请求(假如有一个工作队列,在一段添加命令,另一端是线程。线程从队列中取出命令调用它的execute方法,调用完成将此对象丢弃,再取出下一个命令)和日志请求(执行命令的时候,将历史记录存储在磁盘中,一旦系统死机,成批依次的调用这些对象的execute方法)

第七章 适配器模式和外观模式

书中定义:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

public class TurkeyAdapter implements Duck { //首先,需要实现向转换成的接口
    Turkey turkey;
    public TurkeyAdapter (Turkey turkey) { //取得适配器的对象引用
        this.turkey = turkey;
    }
    public void quack() {
        turkey.gobble(); // 实现接口中的方法,将gobble转换成quack方法
    }
}
        

 

你可能感兴趣的:(HeadFirst设计模式总结)