设计模式(二) | 青训营笔记

114 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第12天

结构型模式

适配器模式

  • 作用:将一个类接口转换成需要的另一个接口。

0f754c1d-b5cb-48cd-90e0-4a86034290a1.png

微信图片_20220804182452.png

public void Computer{
    public void linked(){
        System.out.println("linked!");
    }
}
public class Phone{
    public void usbline(LinkedLine line){
        line.shift();
    }
}
public class LinkedLine implements Usb_to_TypeC{
    private Computer computer;
    public LinkedLine(Computer computer){
        this.computer = computer;
    }
    @Override
    public void shift(){
        computer.linked();
    }
}
public interface Usb_to_TypeC{
    public void shift();
}

桥接模式

  • 作用:将抽象与实现分离,使他们可以独立变化
  • 优势:比继承减少了子类个数,降低维护成本;提高系统可扩充性,符合开闭原则
  • 劣势:增加系统理解和设计的难度 运用场景:一个类存在两个独立变化的维度

微信图片_20220806222428.png

//苹果
class Apple implements Brand{
    @Override
    public void output(){
        System.out.println("Apple");
    }
}
//台式机
class Desktop extends Computer{
   public Desktop(Brand brand){ super(brand); }
    @Override
    public void output(){
        brand.output();
        System.out.println(" Desktop");
    }
}
//电脑抽象类
public abstract class Computer{
    protected Brand brand;
    public Computer(Brand brand){ this.brand = brand }
    public void output(){
        brand.output();
    }
}
//用户
Computer computer = new Desktop(new Apple());
computer.output();

外观模式

  • 作用:提供一个统一的接口,用于访问子系统的一群接口,从而让子系统更容易使用
  • 外观类里面的方法用于控制子系统的接口使用顺序

微信图片_20220806225215.png

代理模式

  • 作用:相当于中介,为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
  • 优点:业务逻辑清晰;有高扩展性,符合开闭原则
  • 静态代理:程序运行前,代理类就已经写好

微信图片_20220807012154.png 微信图片_20220806232624.png

  • 动态代理:运行时由JVM反射机制自动生成

组合模式

  • 作用:将对象组合成树形结构以表示"部分-整体"的层次结构,用于把一组相似的对象当作一个单一的对象
  • 优点:调用简单;高扩展性,符合开闭原则
  • 缺点:叶子和树枝都是实现类,违反依赖倒置原则
class Composite implements Counter{ 
    private List<Counter> counterList = new ArrayList<>();
    @Override
    public int count(){
        int sum = 0;
        for(Counter counter : counterList){
           sum += counter.count();
        }
        return sum;
    }
}
class Phone implements Counter{
    private String name;
    private int sum = 1;
    @Override
    public int count(){
        return sum;
    }
}
public public static void main(String[] args) {
   Composite phone = new Composite();
    phone.add(new Phone("苹果"));
    phone.add(new Phone("华为"));
    Composite xiaomi = new Composite();
    xiaomi.add(new Phone("Max"));
    xiaomi.add(new Phone("Mix"));
    phone.add(xiaomi);
    System.out.println(phone.count());
}