一天学一个模式_第五天:门面模式
定义:
门面模式为了系统提供一个统一的顶端接口,供外部客户使用。也是提供一个更高的层次的接口,使得子系统更容易使用。
形式:
定义一个(或多个)具备所需接口的新类(门面类)
新类门户使用原来的系统
客户使用门面类对象与原系统打交道
使用:
1、客户只需要使用某个复杂系统的子集,或者需要以一种特殊的方式与系统交互时,使用门面模式。
2、当需要跟踪原系统的使用情况时 ,使用门面模面模式。因为所有对系统的访问都经过FACADE,所很可以容易的监视系统的使用 。
3、 希望封装和隐藏原系统时。
4、编写新类的成本小于所有人使用和维护原系统使用所需的成本时
代码解析:
①定义接口
/*
*<b>类描述:</b >定义接口:写信的过程<br>
* <b>邮件:</b> yiyu1@163.com <br>
* @author wonter
*/
public interface GuoCheng {
//信的内容
public void XinContext(String context);
//信封地址,收信人等
public void Envelope(String address);
//将信放入信封
public void Into();
//邮递
public void sendLetter();
}
②定义实现类,去继承①接口。
/**
*<b>类描述:</b >实现类 LetterImp<br>
* <b>邮件:</b> yiyu1@163.com <br>
* @author wonter
*/
public class LetterImp implements GuoCheng {
//写信
public void XinContext(String context) {
System.out.println("信的内容"+context);
}
//写信封
public void Envelope(String address) {
System.out.println("收件人地址及姓名"+address );
}
//将信放入信封
public void Into() {
System.out.println("将信放入信封");
}
//塞到邮箱中,邮递
public void sendLetter() {
System.out.println("邮递信");
}
③【不推荐】这时候,你可以直接在main()方法中写信了。
/**
*<b>类描述:</b >定义 main() 写信<br>
* <b>邮件:</b> yiyu1@163.com <br>
* @author wonter
*/
public class ZhouJielun {
public static void main(String[] args) {
//创建一个处理信件的过程
GuoCheng guocheng = new LetterImp();
//写信
guocheng.XinContext("你好,方文山,你写的歌词我弄丢了。");
//写信封
guocheng.Envelope("273100,山东,曲阜,方文山");
//将信放入信封
guocheng.Into();
//塞到邮箱中,邮递
guocheng.sendLetter();
}
}
【推荐】④怎么样才能更完美,更适合商业项目
③与高内聚的要求相差甚远
为了让调用者更方便的调用, 就对Sub System 进行了封装,增加了一个门面,ZhouJielun 调用时,
直接调用门面的方法就可以了,不用了解具体的实现方法以及相关的业务顺序,
/**
*<b>类描述:</b >我们来看程序的改变,GuoCheng 接口和实现类都没有改变,只是增加了一个Moden 类<br>
* <b>邮件:</b> yiyu1@163.com <br>
* @author wonter
*/
public class Moden {
private GuoCheng guocheng = new LetterImp();
//写信,封装,投递,一体化了
public void sendLetter(String context,String address){
//帮你写信
guocheng.XinContext(context);
//写好信封
guocheng.Envelope(address);
//把信放到信封中
guocheng.Into();
guocheng.sendLetter();
}
}
/**
*<b>类描述:</b >OK 开始 写信
* ZhouJielun的操作简单了很多,提供这种模式后,系统的扩展性也有了很大的提高。<br>
* <b>邮件:</b> yiyu1@163.com <br>
* @author wonter
*/
public class ZhouJielun {
public static void main(String[] args) {
//邮局,有这项服务
Moden moden = new Mod();
//你只要把信的内容和收信人地址给他,他会帮你完成一系列的工作;
String address = "273100,山东,曲阜,方文山";
String context = "你好,方文山,你写的歌词我弄丢了。";
moden.sendLetter(context, address);
}
}
⑤突然一个非常时期(比如中美大战),寄往 洛杉矶 的邮件都必须进行安全检查。怎么办呢?
/**
*<b>类描述:</b >
*只是增加了一个 rPolice 变量的声明以及一个方法的调用,那这个写信的过程就变成了这样:先
*写信,然后写信封,然后警察开始检查,然后才把信放到信封,然后发送出去。
*<br>
* <b>邮件:</b> yiyu1@163.com <br>
* @author wonter
*/
public class Moden {
private GuoCheng guocheng = new LetterImp();
//按需要定义Police
private Police letterPolice = new Police();
//写信,封装,投递,一体化了
public void sendLetter(String context,String address){
//帮你写信
guocheng.writeContext(context);
//写好信封
guocheng.fillEnvelope(address);
//警察要检查信件了
letterPolice.checkLetter(guocheng);
//把信放到信封中
guocheng.into();
//邮递信件
guocheng.sendLetter();
}
}
好处:
门面模式是一个很好的封装方法,一个子系统比较复杂,比如算法或者业务比较复杂,
就可以封装出一个或多个门面出来,项目的结构简单,而且扩展性非常好。还有,在一个较大项目
中的时候,为了避免人员带来的风险,也可以使用这个模式。
缺点:
1) 当你要为了一个复杂子系统提供一个简单接口时。在上面已经描述了原因。
2) 由于抽象类的实现部分与客户程序之间存在着很大的依赖性。引入 facade 将这个子系统与客户以及其他的子系统分离,
可以提高子系统的独立性和可移植性(上面也提到了)。
3) 当你需要构建一个层次结构的子系统时,使用 facade 模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,
你可以让它们仅通过 facade 进行通讯,从而简化了它们之间的依赖关系。
加微信:wonter 发送:技术Q
医疗微信群:
加微信:wonter 发送:医疗Q
更多文章关注公众号: