Java设计模式--外观模式

外观模式

为系统中的一组接口提供一个一致的界面,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

文章目录
  1. 1. 外观模式
  2. 2. Facade Pattern
  3. 3. 类图
  4. 4. 模式的结构与使用
  5. 5. 简单的例子
    1. 5.1. 子系统CheckWord.java
    2. 5.2. 子系统Charge.java
    3. 5.3. 子系统TypeSeting.java
    4. 5.4. 外观ClientServerFacade.java
    5. 5.5. 测试类Application.java
  6. 6. 运行截图
  7. 7. 外观模式的优点
  8. 8. 适用外观模式的情景
  9. 9. 下载源码请到