设计模式(十一)——外观模式

130 阅读3分钟

上一篇:设计模式(十)——组合模式

下一篇:设计模式(十二)——亨元模式

一、需求

官方解释: Provide a unified interface to a set of interface in a subsystem.Facede defines a higher-level interface that makes the subsystem easier to use.(要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供了一个高层次的接口,使得子系统更容易使用。)

我的理解: 外观模式就是提供一个类,将要完成的操作打包放在一起,方便客户端的操作。

参与者: Facade(外观类)、SubSystem(子系统类)

类图:

二、代码

可以不使用外观模式吗?可以,外观模式提供一个类,将要完成的操作打包放在一起,不是外观模式,那具体操作步骤就都要交由客户端完成。参见代码2。

外观模式可以扩展吗?可以,而且扩展相当方便,参见代码3。

代码1——外观模式启动电脑,代码2——不用外观模式启动电脑,代码3——外观模式启动电脑和关闭电脑

代码1——外观模式(启动电脑)

package mypackage;


public class DesignPatternDemo {

	public static void main(String[] args) {
		Facade facade=new Facade(new CPU(),new Memorey(),new Disk());
		facade.start();
	}

}
class Facade{
	private Hardware cpu;
	private Hardware memory;
	private Hardware disk;
	public Facade(Hardware cpu,Hardware memory,Hardware disk){
		this.cpu=cpu;
		this.memory=memory;
		this.disk=disk;
	}
	public void start(){
		cpu.start();
		memory.start();
		disk.start();
	}
}
interface Hardware{
	void start();
}
class CPU implements Hardware{

	@Override
	public void start() {
		System.out.println("start cpu");
	}
	
}
class Memorey implements Hardware{

	@Override
	public void start() {
		System.out.println("start memory");
	}
	
}
class Disk implements Hardware{

	@Override
	public void start() {
		System.out.println("start disk");
	}
	
}

输出1:

start cpu
start memory
start disk

代码2——不用外观模式(启动电脑)

package mypackage;


public class DesignPatternDemo {

	public static void main(String[] args) {
		new CPU().start();
		new Memorey().start();
		new Disk().start();
	}

}

interface Hardware{
	void start();
}
class CPU implements Hardware{

	@Override
	public void start() {
		System.out.println("start cpu");
	}
	
}
class Memorey implements Hardware{

	@Override
	public void start() {
		System.out.println("start memory");
	}
	
}
class Disk implements Hardware{

	@Override
	public void start() {
		System.out.println("start disk");
	}
	
}

输出2:

start cpu
start memory
start disk

代码3——外观模式扩展(启动电脑和关闭电脑)

package mypackage;


public class DesignPatternDemo {

	public static void main(String[] args) {
		Facade facade=new Facade(new CPU(),new Memorey(),new Disk());
		facade.start();
		
		System.out.println("==================");
		facade.close();
	}

}
class Facade{
	private Hardware cpu;
	private Hardware memory;
	private Hardware disk;
	public Facade(Hardware cpu,Hardware memory,Hardware disk){
		this.cpu=cpu;
		this.memory=memory;
		this.disk=disk;
	}
	public void start(){
		cpu.start();
		memory.start();
		disk.start();
	}
	public  void close() {
		disk.close();
		memory.close();
		cpu.close();
	}
}
interface Hardware{
	void start();
	void close();
}
class CPU implements Hardware{

	@Override
	public void start() {
		System.out.println("start cpu");
	}

	@Override
	public void close() {
		System.out.println("close cpu");
		
	}
	
}
class Memorey implements Hardware{

	@Override
	public void start() {
		System.out.println("start memory");
	}

	@Override
	public void close() {
		System.out.println("close memory");
		
	}
	
}
class Disk implements Hardware{

	@Override
	public void start() {
		System.out.println("start disk");
	}

	@Override
	public void close() {
		System.out.println("close disk");
		
	}
	
}

输出3:

start cpu
start memory
start disk
==================
close disk
close memory
close cpu

三、小结

设计模式只重其意不重其形,外观模式只是将要完成的操作打包起来,将业务逻辑放在外观类里,项目开发中,不一定非要使用外观模式,只取决于开发者将业务逻辑放在哪里的问题,只要可以完成业务功能即可,一切为代码服务,一切为需求服务,设计模式是活学活用,不强求。

 

上一篇:设计模式(十)——组合模式

下一篇:设计模式(十二)——亨元模式