《设计模式》10.外观模式(结构型)

为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用,隐藏系统的复杂性。

角色

外观(Facade):为多个子系统对外提供一个共同的接口
子系统(Sub-System):实现系统的部分功能,客户可以通过外观角色访问它
客户(Client):通过一个外观角色访问各个子系统的功能

子系统 SubSystem

public class SubSystem {
    private String name;
    public SubSystem(String name) {
        this.name = name;
    }

    public void start() {
        System.out.println("start " + name);
    }

    public void stop() {
        System.out.println("stop " + name);
    }
}

外观 Facade

import java.util.ArrayList;
import java.util.List;

public class Facade {
    List<SubSystem> subSyss;
    public Facade(String ... subSysNames) {
        subSyss = new ArrayList<>(subSysNames.length);
        for (String subSysName : subSysNames) {
            subSyss.add(new SubSystem(subSysName));
        }
    }

    public void start() {
        for (SubSystem subSys : subSyss) {
            subSys.start();
        }
    }

    public void stop() {
        for (SubSystem subSys : subSyss) {
            subSys.stop();
        }
    }
}

客户 Client

public class Client {
    public static void main(String args[]) {
        Facade facade = new Facade("SubSys#1", "SubSys#2", "SubSys#3");
        facade.start();
        facade.stop();
    }
}

举例

电脑的启动和关机需要各个部件:CPU、主板、RAM、电源、硬盘的分工合作,将这些操作通过门面模式封装到启动和关机操作中

子系统 Power / MainBoard / HardDisk / Ram / Cpu / GraphicsCard

public class Power {
    public void supply() {
        System.out.println("Power supply...");
    }

    public void cutOff() {
        System.out.println("Cut off power");
    }
}

public class MainBoard {
    public void boot() {
        System.out.println("Mainboard boot...");
    }

    public void stop() {
        System.out.println("Stop mainboard...");
    }
}

public class HardDisk {
    public void read() {
        System.out.println("Read data...");
    }

    public void save() {
        System.out.println("Save data...");
    }
}

public class Ram {
    public void load() {
        System.out.println("Load data...");
    }

    public void clear() {
        System.out.println("Clear data...");
    }
}

public class Cpu {
    public void execute(String command) {
        System.out.println("Execute " + command + " command...");
    }
}

public class GraphicsCard {
    public void display() {
        System.out.println("Display desktop");
    }

    public void stop() {
        System.out.println("Stop display");
    }
}

外观 ComputerFacade

public class ComputerFacade {
    private Power power;
    private MainBoard mainBoard;
    private HardDisk hardDisk;
    private Ram ram;
    private Cpu cpu;
    private GraphicsCard graphicsCard;

    public ComputerFacade() {
        power = new Power();
        mainBoard = new MainBoard();
        hardDisk = new HardDisk();
        ram = new Ram();
        cpu = new Cpu();
        graphicsCard = new GraphicsCard();
    }

    public void start() {
        power.supply();
        mainBoard.boot();
        hardDisk.read();
        ram.load();
        cpu.execute("start");
        graphicsCard.display();
    }

    public void stop() {
        cpu.execute("shutdown");
        ram.clear();
        hardDisk.save();
        graphicsCard.stop();
        mainBoard.stop();
        power.cutOff();
    }
}

测试类

public class ComputerFacadeTester {
    public static void main(String args[]) {
        ComputerFacade facade = new ComputerFacade();
        facade.start();
        facade.stop();
    }
}

参考:
http://c.biancheng.net/view/1369.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值