23个java设计模式(七)-- 外观模式

2016年03月15日 原创
关键词: java 设计模式
摘要 外观模式为系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

一、概述。

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

一个大的系统一般都由若干个子系统构成,每个子系统包含多个类,这些类协同合作为用户提供所需要的功能。一个客户程序中的某个类的实例如果直接和子系统的多个类的实例打交道完成某项任务,就会使客户程序中的类和子系统类有过多的依赖关系。此时使用外观模式尤为重要。

外观模式是简化用户和子系统进行交互的成熟模式,外观模式的关键是为子系统提供一个称作外观的类,该外观类的实例负责和子系统中类的实例打交道。当用户想要和子系统中的若干个类的实例打交道时,可以代替地和子系统的外观类的实例打交道。

二、外观模式的结构。

外观模式的结构中包括两种角色。

  • 子系统(Subsystem):子系统是若干个类的集合,这些类的实例协同合作为用户提供所需要的功能,子系统中任何类都不包含外观类的实例引用。
  • 外观(Facade):外观是一个类,该类包含子系统中全部或部分类的实例引用,当用户想要和子系统中的若干个类的实例打交道时,可以代替地和子系统的外观类的实例打交道。

三、示例程序。

下面是一个广告系统的实例程序。

子系统(Subsystem)

Charge.java

public class Charge {
	public final int BASICCHARGE=12;
	private CheckWord checkWord;
	public Charge(CheckWord checkWord) {
		this.checkWord = checkWord;
	}
	public void giveCharge() {
		int charge = checkWord.getAmount()*BASICCHARGE;
		System.out.println("广告费用:"+charge+"元");
	}
}

CheckWord.java

public class CheckWord {
	public final int BASICAMOUNT=85;
	private String advertisement;
	private int amount;
	public CheckWord(String advertisement) {
		this.advertisement = advertisement;
	}
	public void setChargeAmount() {
		amount = advertisement.length()+BASICAMOUNT;
	}
	public int getAmount() {
		return amount;
	}
}

TypeSetting.java

public class TypeSetting {
	private String advertisement;

	public TypeSetting(String advertisement) {
		this.advertisement = advertisement;
	}
	
	public void typeSetting() {
		System.out.println("广告排版格式:");
		System.out.println(" *********** ");
		System.out.println(advertisement);
		System.out.println(" *********** ");
	}
}

外观

ClientServerFacade.java

public class ClientServerFacade {
    private CheckWord checkWord;
    private Charge charge;
    private TypeSetting typeSetting;
    String advertisement;

    public ClientServerFacade(String advertisement) {
        this.advertisement = advertisement;
        checkWord = new CheckWord(advertisement);
        charge = new Charge(checkWord);
        typeSetting = new TypeSetting(advertisement);
    }

    public void doAdvertisement() {
        checkWord.setChargeAmount();
        charge.giveCharge();
        typeSetting.typeSetting();
    }
}


测试程序

public class Example1Test {
	@Test
	public void testMain() {
		String advertisement = "月光电脑,价格4000元,联系电话:12345";
		ClientServerFacade client = new ClientServerFacade(advertisement);
		client.doAdvertisement();
	}
}

四、外观模式的优点。

  1. 使客户和子系统中的类无耦合,并且使子系统使用起来更加方便。
  2. 外观只是提供了一个更加简洁的界面,并不影响用户直接使用子系统中的类。
  3. 子系统中任何类对其方法的内容进行修改,不影响外观类的代码。

五、适合使用外观模式的情景。

  • 对于一个复杂的子系统,需要为用户提供一个简单的交互操作。
  • 不希望客户代码和子系统中的类有耦合,以便提高子系统的独立性和可移植性。
  • 当整个系统需要构建一个层次结构的子系统,不希望这些子系统相互直接的交互。