《大话设计模式》读书笔记(五)

写在前面

本文上接:《大话设计模式》读书笔记(四),这次来学习抽象工厂模式、状态模式和适配器模式。

10.抽象工厂模式(Abstract Factory Pattern)

解决的问题

抽象工厂模式的出现,使得改变一个应用的具体工厂变得非常容易,他只需要修改具体工厂就可以用不同的产品配置。通过抽象工厂模式,我们可以让一个系统不再依赖于产品类实例是如何被创建、组合和表达的细节,使得系统更加抽象,优雅。

类图结构

image-20201215144217642

其中,AbstractProductAAbstractProductB是两个抽象产品,而ProductA1以及ProductB1等类似的类就是对两个抽象产品的实现。AbstractFactory是抽象工厂接口,里面包含了所有产品创建的抽象方法,ConcreteFactory1和2就是具体的工厂实现类了。

好处和坏处

首先,抽象工厂模式分离了接口和实现,使得客户端简化了需要知道的东西。同时使得切换产品族变得十分容易,一个具体的工厂实现代表的试一个产品族,转换产品族只需要切换一下具体工厂就好了。

但如果要给整个产品族添加新的产品,那么就需要修改抽象工厂类,使得该模式不太容易扩展新的产品。

11.状态模式(State Pattern)

解决的问题

状态模式,当一个对象的内在状态改变时,允许改变其行为。主要解决的是控制一个对象状态转换的条件表达式过于复杂的时候,可以把状态的判断逻辑转移到表示不同状态的一系列类当中,把复杂的判断逻辑简化。

类图结构

image-20201215145122662

State类表示一个抽象状态类,定义一个接以封装与Context的一个特定状态相关的行为,ConcreteStateA,B,C是具体的状态,每一个子类实现一个与Context的一个状态相关的行为。

State:

public abstract class State{
    public abstract void Handle(Context context);
}

ConcreteState:

public class ConcreteStateA extends State{
   @Override
   public void Handle(Context context){
       context.state = new ConcreteStateB();
   }
}
public class ConcreteStateB extends State{
    @Override
    public void Handle(Context context){
        context.state = new ConcreteStateA();
    }
}

Context:

public class Context{
	private State state;
    public Context(State state){
        this.state = state;
    }
    public void setState(State state){
        this.state = state;
        System.out.println("当前状态:" +state.getType().name);
    }
    public State getState(){
        return this.state;
    }
    public void Request(){
        state.Handle(this);
    }
}

好处与坏处

状态模式的好处是当与特定状态相关的行为局部化,将不同状态的行为分隔开来。但当状态过多的时候,会造成系统内类太多。

12.适配器模式(Adapter Pattern)

解决的问题

适配器模式可以适用于当系统的数据和行为都不变的情况下接口不符,可以使用适配器模式使得控制范围之外的一个原有对象与某个接口匹配。

类图结构

image-20201215150432491

Target接口是客户所期待的接口,目标可以是具体的或者抽象的类,也可以是接口。Adapter类通过在内部包装一个Adaptee对象把源接口转换成目标接口。Adaptee类表示需要适配的类。

Target:

public class Target{
    public void Request(){
        System.out.println("普通请求!");
    }
}

Adaptee:

public class Adaptee{
    public void specificRequest(){
        System.out.println("特殊请求");
    }
}

Adapter:

public class Adapter extends Target{
    private Adaptee adaptee = new Adaptee();
    @Override
    public void Request(){
        adaptee.specificRequest();
    }
}

好处与坏处

适配器模式增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性。缺点就在于有时候其在java这种不支持多重继承的语言的使用有一定的局限性。

总结

总的来说,这次学习了三个模式。快要考设计模式了,等考完再接着写。

原文地址:https://www.cnblogs.com/wushenjiang/p/14138843.html