headfrist 设计模式

2017-11-04  本文已影响16人  木书

导语:此文章主要记述几种设计模式的定义、类图与设计原则,需要此前对设计模式有一定了解,详细可以阅读《head frist 设计模式》,若想一起讨论、学习,请加QQ群:518105162

一、策略模式:

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


策略模式

设计原则:

二、观察者模式

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


观察者模式

设计原则:

三、装饰者模式

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


装饰者模式定义类图

星巴兹咖啡销售系统装饰者模式类图关系:

装饰者模式

四、工厂模式:

简单工厂:

public class SimplePizzaFactory {

    public Pizza createPizza(String type) {
        Pizza pizza = null;

        if (type.equals("cheese")) {
            pizza = new CheesePizza();
        } else if (type.equals("pepperoni")) {
            pizza = new PepperoniPizza();
        } else if (type.equals("clam")) {
            pizza = new ClamPizza();
        } else if (type.equals("veggie")) {
            pizza = new VeggiePizza();
        }
        return pizza;
    }
}
public class PizzaStore {
    SimplePizzaFactory factory;
 
    public PizzaStore(SimplePizzaFactory factory) { 
        this.factory = factory;
    }
 
    public Pizza orderPizza(String type) {
        Pizza pizza;
 
        pizza = factory.createPizza(type);
 
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();

        return pizza;
    }

}

工厂方法模式:

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

工厂方法模式定义类图

披萨店关系类图:

工厂方法模式

抽象工厂模式:

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

设计原则:

这个原则告诉我们,应该重写代码以便于我们依赖抽象类,而不是依赖具体类。对于高层及低层模块都应该如此。

五、单例模式(单件模式)

确保一个类只有一个实例,并提供一个全局访问点。


单例模式
public class Singleton {
    private static Singleton uniqueInstance;
 
    // other useful instance variables here
 
    private Singleton() {}
 
    public static  Singleton getInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
 
    // other useful methods here
    public String getDescription() {
        return "I'm a thread safe Singleton!";
    }
}
public class Singleton {
    private static Singleton uniqueInstance = new Singleton();
 
    private Singleton() {}
 
    public static Singleton getInstance() {
        return uniqueInstance;
    }
    
    // other useful methods here
    public String getDescription() {
        return "I'm a statically initialized Singleton!";
    }
}

如果不做处理的话,急加载单例比懒加载更加线程安全,但是如果懒加载使用synchronized“锁住”getInstance方法的话,就会变成线程安全的单例。但是这两种线程安全的方式都降低了程序性能,可以在使用懒加载时给uniqueInstance字段加volatile关键字以提高程序执行性能。

六、命令模式

将请求封装成对象,这可以让你使用不同的请求、队列,或者日志请求来参数化其他对象。命令模式也可以支持撤销操作。

七、适配器模式

适配器(adapter-pattern):将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

  • 对象适配器(组合)
  • 类适配器(多重继承):在Java中不能实现

外观模式(facade-pattern):提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

要点:

十一、代理模式

代理模式:为另一个对象提供一个替身或占位符以控制对这个对象的访问。

结语:

如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【喜欢】一下!如果你有更好的建议,不如留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。

上一篇 下一篇

猜你喜欢

热点阅读