设计模式

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

创建型模式
0、简单工厂模式:又叫做静态工厂方法。
作用:
(1)代替构造函数创建对象
JDK中体现:
(1)Integer.valueOf
(2)Class.forName

1、工厂方法模式
作用:子类决定哪一个类实例化。方法的调用对象可以是多种声明类。
JDK中体现:Collection.iterator方法【list.iterator(),set.iterator()】

2、抽象工厂模式:
作用:创建多种类的对象
JDK中体现:
(1)java.sql包
conn.createStatement();
conn.prepareStatement(sql);
conn.prepareCall(sql)
一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类可以创建多个具体产品类的实例
Connection可以派生多个具体工厂,同时每个工厂都可以生产Statement、PreparedStatement、CallableStatement。

3、单例模式:
4、建造者模式(生成器模式):将一个复杂对象的构建与它的表示分离,同构建不同表示
StringBuilder#append():AbstractStringBuilder#append去建造,StringBuilder#append去表示
StringBuffer#append():AbstractStringBuilder#append去建造,StringBuffer#append去表示

5、原型模式:
克隆

结构型模式
6、适配器模式:
用来把一个接口转化成另一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
java.util.Arrays#asList()
java.io.InputStreamReader(InputStream):InputStreamReader和InputStream没有父子关系
java.io.OutputStreamWriter(OutputStream)
7、装饰者模式:为一个对象动态的加上一系列的动作,而不需要因为这些动作的不同而产生大量的继承类
java.io.BufferedInputStream(InputStream):BufferedInputStream是InputStream的子类,因此包含了父类的所有方法
java.io.DataInputStream(InputStream)
java.io.BufferedOutputStream(OutputStream)
java.util.zip.ZipOutputStream(OutputStream)

8、代理模式:为其他对象提供代理以控制这个对象的访问
spring注解

9、外观模式:提供一个统一的接口,用来访问子系统里的一群接口
10、桥接模式:有一个抽象类、继承类,抽象类中有一个接口对象(接口有多个实现类),调用继承类的方法触动抽象类方法,继而触动接口对象的方法
11、组合模式:如菜单、单位树
12、享元模式(蝇量模式):共享元素,
不存在创建,存在缓存
String常量池、数据库连接池、缓冲池

行为型模式
13、策略模式:购物车优惠方案(满足一个):满减、首次购物折扣、二次购物折扣、假日优惠。注入折扣方式,改变结算金额。setDiscount(new FullDiscount()) 运行时改变行为
14、模板方法模式:定义算法的步骤,步骤实现延迟到子类中.
15、观察者模式:一个对象状态改变时通知其它对象
Observer、Observable
16、迭代子模式:iterator
17、责任链模式:一个同接口的链完成后,传递给另一个同接口的链
18、命令模式:发出请求对象和执行请求对象解耦,由命令对象衔接
19、备忘录模式:有将对象返回之前状态需求。依据单一责任原则,不要和关键对象混在一起。场景可为游戏存档及恢复、事务回滚
20、状态模式:发生变化时,从一种状态改变到另一种状态。每个状态有不同的行为
21、访问者模式:利用双重分派机制,弥补java多态方法重载是静态化的不足
两个类(访问者作为参数进入元素方法,双重分派,最终触发元素新方法)
element.accept(new Visitor());
visitor.visit(this);
elementPram.doSomething();
先把访问者分派给元素,再把元素分派给访问者,访问者再调用元素方法
22、中介者模式:提供了一个中介类,该类通常处理不同类之间的通信。如MVC中的控制器
23、解释器模式:可用在sql语法解析或者公式解析。许多类,每个类解析一类表达式,有公共的入口方法名,公共的上下文参数(字符串输入流)

生产者消费者模式并不是GOF提出的23种设计模式之一,23种设计模式都是建立在面向对象的基础之上的,生产者消费者模式是面向过程的。

7、装饰器模式:

       AbstractFactory factory = new AppleFactory();
        //得到水果
        Fruit fruit = factory.getFruit();
        fruit.draw();
        //得到包装
        Bag bag = factory.getBag();

        //现需要增加防伪标识
        bag = new CheckedBagDecorator(bag);//防伪功能
        bag = new ReinforceBagDecorator(bag);//加固功能
        bag = new SpeedDecorator(bag);//加急功能

        bag.pack();

14.模板方法模式:定义算法的步骤,步骤实现延迟到子类中.准备食谱prepareRecipe(){煮茶方法;冲泡方法;倒进杯子;加调料;}.冲泡咖啡还是茶叶,加糖还是柠檬由子类决定
15.观察者模式:一个对象状态改变时通知其它对象

    List<Observer> observers = new ArrayList();
    //发通知
    public void notifyObservers() {
        //遍历观察者集合,调用每一个顾客的购买方法
        for(Observer obs : observers) {
            obs.update();
        }
    }

jdk 有Observable(商家) Observer(客户)
17.责任链模式:一个同接口的链完成后,传递给另一个同接口的链。
购物符合:满减->首次购物折扣->二次购物折扣->假日优惠

 private static MultyDiscount multyDiscount = new FullMultyDiscount(null);
    static {
        multyDiscount = new NewerMultyDiscount(multyDiscount);
        multyDiscount = new SecondMultyDiscount(multyDiscount);
        multyDiscount = new HolidayMultyDiscount(multyDiscount);
    }

18.命令模式:发出请求对象和执行请求对象解耦,命令对象衔接
19.访问者模式:利用双重分派机制,弥补java多态方法重载是静态化的不足。
举例:统计苹果、香蕉、梨等水果价格

public class Apple implements Fruit {
    public void sell(Visit visit){
        visit.sell(this);
    }
}
public class Visit {
    public void sell(Fruit fruit) {
        System.out.println("卖水果");
    }
    public void sell(Apple apple) {
        System.out.println("卖苹果");
    }
}
public class Test {
    public static void main(String[] args) {
        Fruit fruit = new Apple();
        new Visit().sell(fruit);//卖水果(根据接口声明判断)==期待卖苹果
        
        fruit.sell(new Visit());//卖苹果
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容