结构模式---外观模式和静态代理

外观模式

外观模式解决的是复杂系统的问题,将复杂系统的多个步骤封成一个步骤对外呈现,减少客户端的操作,比如说一个家里有电视,冰箱,电灯,我回家需要把这些依次打开,如果有一个开关,这个把这三都开了多好,这个总开关就是外观;外观模式主要是省略了交互,原先客户端需要和电视,冰箱,电灯都交互才能完成全部动作,现在只需要和外观类交互即可
外观模式可以将类图1转化为类图2
类图1:
这里写图片描述
类图二:
这里写图片描述
外观类:

public class Facade {
    private TV tv;
    private IceBox iceBox;
    private Light light;

    public Facade() {
        this.tv = new TV();
        this.iceBox = new IceBox();
        this.light = new Light();
    }

    public void open() {
        this.tv.OpenTV();
        this.iceBox.OpenIceBox();
        this.light.OpenLight();
    }
}

各个需要被外观的类:

public class TV {
    public void OpenTV(){
        System.out.println("打开电视");
    }
}
public class IceBox {
    public void OpenIceBox(){
        System.out.println("打开冰箱");
    }
}
public class Light {
    public void OpenLight(){
        System.out.println("打开电灯");
    }
}

客户端:

public class Client {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.open();
    }
}

结果:

打开电视
打开冰箱
打开电灯

静态代理

静态代理的类图和外观很像,还是刚才的例子,冰箱、电视、电灯打开的问题,如果外观类的代码变为以下情况就是静态代理了

public class Facade {
    private TV tv;
    private IceBox iceBox;
    private Light light;

    public Facade() {
        this.tv = new TV();
        this.iceBox = new IceBox();
        this.light = new Light();
    }

    public void OpenTV() {
        this.tv.OpenTV();
    }
    public void OpenIceBox() {
        this.iceBox.OpenIceBox();
    }
    public void OpenLight() {
        this.light.OpenLight();
    }
}

客户端:

public class Client {
    public static void main(String[] args) {
        Facade facade = new Facade();

        facade.OpenTV();
        facade.OpenIceBox();
        facade.OpenLight();
    }
}

结果:

打开电视
打开冰箱
打开电灯

也就是说静态代理只是对其他对象的行为进行简单的调用,并不进行组合
静态代理类图:
这里写图片描述
外观和静态代理的区别

模式 是否持有其他对象 是否对其他对象的行为进行组合
外观 持有 组合
静态代理 持有 不组合

猜你喜欢

转载自blog.csdn.net/weixin_43060721/article/details/82313877