外观模式
为系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
Facade Pattern
Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.
类图
模式的结构与使用
外观模式的结构中包两种角色。
- 子系统(Subsystem):子系统是若干个类的集合,这些类的实例协同合作为用户提供所需要的功能,子系统中任何类都不包含外观类的实例引用。
- 外观(Facade):外观是一个类,该类包含子系统中全部或部分类的实例引用,当用户想要和子系统中的若干个类的实例打交道时,可以代替地和子系统的外观类的实例打交道。
简单的例子
子系统CheckWord.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| package Facade; public class CheckWord { public final int basicAmount = 85; String advertisement; int amount; public CheckWord(String advertisement) { this.advertisement = advertisement; } public void setAmount() { this.amount = this.advertisement.length() + basicAmount; } public int getAmount() { return this.amount; } }
|
子系统Charge.java
1 2 3 4 5 6 7 8 9 10 11 12 13
| package Facade; public class Charge { public final int basicCharge = 12; CheckWord checkWord; Charge(CheckWord checkWord) { this.checkWord = checkWord; } public void giveCharge() { int charge = checkWord.getAmount() * basicCharge; System.out.println("广告费用:" + charge + "元"); } }
|
子系统TypeSeting.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| ppackage Facade; public class TypeSeting { String advertisement; public TypeSeting(String advertisement) { this.advertisement = advertisement; } public void typeSeting() { System.out.println("广告排版格式:"); System.out.println("*****************"); System.out.println(this.advertisement); System.out.println("*****************"); } }
|
外观ClientServerFacade.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| package Facade; public class ClientServerFacade { private CheckWord checkWord; private Charge charge; private TypeSeting typeSeting; String advertisement; public ClientServerFacade(String advertisement) { this.advertisement = advertisement; checkWord = new CheckWord(advertisement); charge = new Charge(checkWord); typeSeting = new TypeSeting(advertisement); } public void doAdvertisement() { checkWord.setAmount(); charge.giveCharge(); typeSeting.typeSeting(); } }
|
测试类Application.java
1 2 3 4 5 6 7 8 9 10
| package Facade; public class Application { public static void main(String[] args) { String clientAdvertisement = "电脑,价格63377,联系电话5059676"; ClientServerFacade csf = new ClientServerFacade(clientAdvertisement); csf.doAdvertisement(); } }
|
运行截图
外观模式的优点
- 使客户和子系统中的类无耦合,并且使子系统使用起来更加方便。
- 外观只是提供了一个更加简洁的界面,并不影响用户直接使用子系统中的类。
- 子系统中任何类对方法的内容进行修改,不影响外观类的代码。
适用外观模式的情景
- 对于一个复杂的子系统,需要为用户提供一个简单的交互操作。
- 不希望客户代码和子系统中的类有耦合,以便提高子系统的独立性和可移植性。
- 当整个系统需要构建一个层次结构的子系统,不希望这些子系统相互直接的交互。
下载源码请到
MyGitHub