概要:
该文章参考了《设计模式之禅》一书及一些前辈的博客文章
1.该文章阐述了门面模式的基础原理及示例代码;
2.该文章适合初学设计模式的技术人员研习;
3.该文章有许多不足之处,请各位大咖指正,喷子绕道;
正文:
门面模式(外观模式):要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。
1.门面模式示例代码实现:
package com.csdn;
/**
* 做饭所有的流程
* @author Administrator
*
*/
public interface Cook {
//买菜
public String buyVegetables(String _vegetables);
//洗菜
public void washVegetables();
//炒菜
public void cooking();
}
package com.csdn;
/**
* 做饭每个流程具体实现
* @author Administrator
*
*/
public class CookImpl implements Cook {
private String vegetables;
@Override
public String buyVegetables(String _vegetables) {
System.out.println("买了:"+_vegetables);
return this.vegetables = _vegetables;
}
@Override
public void washVegetables() {
System.out.println("开始洗:"+vegetables);
}
@Override
public void cooking() {
System.out.println("开始炒:"+vegetables);
}
}
package com.csdn;
/**
* 保姆做饭
* @author Administrator
*
*/
public class Nanny {
Cook cook = new CookImpl();
//做饭流程一体化
public void cook(String _vegetables){
cook.buyVegetables(_vegetables);
cook.washVegetables();
cook.cooking();
}
}
package com.csdn;
/**
* 模拟主人命令保姆做饭
* @author Administrator
*
*/
public class Client {
public static void main(String[] args) {
//找到保姆
Nanny nanny = new Nanny();
//告诉保姆做“大白菜”
nanny.cook("大白菜");
}
}
输出:
买了:大白菜
开始洗:大白菜
开始炒:大白菜
注:
a:门面模式注重”统一的对象”,也就是提供一个访问子系统的接口,除了这个接口不允许有任何访问子系统的行为发生。
b:门面模式是一种常用的封装模式
c:门面模式包含了门面角色和子系统角色。
1.通用门面模式模板代码实现:
子系统
public class ClassA{
public void doSomethingA(){
//业务逻辑
}
}
public class ClassB{
public void doSomethingB(){
//业务逻辑
}
}
public class ClassC{
public void doSomethingC(){
//业务逻辑
}
}
门面对象
public class Facade{
//被委托对象
private ClassA a = new ClassA();
private ClassB b = new ClassB();
private ClassC c = new ClassC();
//提供给外部访问方法
public void methodA(){
this.a.doSomethingA();
}
public void methodB(){
this.b.doSomethingB();
}
public void methodC(){
this.c.doSomethingC();
}
}
注:
a:门面模式不符合开闭原则
b:门面模式应用场景:(为一个复杂模块或子系统提供一个共外界访问的接口)(外界对子系统的访问黑箱操作即可)(预防低水平人员带来的风险扩散)。
c:门面不参与子系统内的业务逻辑。例如通用模板中的methodC()方法中就不应该增加调用doSomethingA()方法,如果需要调用,需增加一个封装类。