plone网站开发,网站外链平台的建设方法平台类型(至少5个)?,wordpress统计访客,网站建设数据库的链接外观模式
1 概述
有些人可能炒过股票#xff0c;但其实大部分人都不太懂#xff0c;这种没有足够了解证券知识的情况下做股票是很容易亏钱的#xff0c;刚开始炒股肯定都会想#xff0c;如果有个懂行的帮帮手就好#xff0c;其实基金就是个好帮手#xff0c;支付宝里就…外观模式
1 概述
有些人可能炒过股票但其实大部分人都不太懂这种没有足够了解证券知识的情况下做股票是很容易亏钱的刚开始炒股肯定都会想如果有个懂行的帮帮手就好其实基金就是个好帮手支付宝里就有许多的基金它将投资者分散的资金集中起来交由专业的经理人进行管理投资于股票、债券、外汇等领域而基金投资的收益归持有者所有管理机构收取一定比例的托管管理费用。
定义
又名门面模式是一种通过为多个复杂的子系统提供一个一致的接口而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口外部应用程序不用关心内部子系统的具体的细节这样会大大降低应用程序的复杂度提高了程序的可维护性。
外观Facade模式是“迪米特法则”的典型应用 2 结构
外观Facade模式包含以下主要角色
外观Facade角色为多个子系统对外提供一个共同的接口。子系统Sub System角色实现系统的部分功能客户可以通过外观角色访问它。
3 案例
【例】智能家电控制
小明的爷爷已经60岁了一个人在家生活每次都需要打开灯、打开电视、打开空调睡觉时关闭灯、关闭电视、关闭空调操作起来都比较麻烦。所以小明给爷爷买了智能音箱可以通过语音直接控制这些智能家电的开启和关闭。类图如下 代码如下
//灯类
public class Light {public void on() {System.out.println(打开了灯....);}public void off() {System.out.println(关闭了灯....);}
}//电视类
public class TV {public void on() {System.out.println(打开了电视....);}public void off() {System.out.println(关闭了电视....);}
}//控制类
public class AirCondition {public void on() {System.out.println(打开了空调....);}public void off() {System.out.println(关闭了空调....);}
}//智能音箱
public class SmartAppliancesFacade {private Light light;private TV tv;private AirCondition airCondition;public SmartAppliancesFacade() {light new Light();tv new TV();airCondition new AirCondition();}public void say(String message) {if(message.contains(打开)) {on();} else if(message.contains(关闭)) {off();} else {System.out.println(我还听不懂你说的);}}//起床后一键开电器private void on() {System.out.println(起床了);light.on();tv.on();airCondition.on();}//睡觉一键关电器private void off() {System.out.println(睡觉了);light.off();tv.off();airCondition.off();}
}//测试类
public class Client {public static void main(String[] args) {//创建外观对象SmartAppliancesFacade facade new SmartAppliancesFacade();//客户端直接与外观对象进行交互facade.say(打开家电);facade.say(关闭家电);}
}好处
降低了子系统与客户端之间的耦合度使得子系统的变化不会影响调用它的客户类。对客户屏蔽了子系统组件减少了客户处理的对象数目并使得子系统使用起来更加容易。
缺点
不符合开闭原则修改很麻烦
4 使用场景
对分层结构系统构建时使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。当一个复杂系统的子系统很多时外观模式可以为系统设计一个简单的接口供外界访问。当客户端与多个子系统之间存在很大的联系时引入外观模式可将它们分离从而提高子系统的独立性和可移植性。
5 源码解析
使用tomcat作为web容器时接收浏览器发送过来的请求tomcat会将请求信息封装成ServletRequest对象如下图①处对象。但是大家想想ServletRequest是一个接口它还有一个子接口HttpServletRequest而我们知道该request对象肯定是一个HttpServletRequest对象的子实现类对象到底是哪个类的对象呢可以通过输出request对象我们就会发现是一个名为RequestFacade的类的对象。 RequestFacade类就使用了外观模式。先看结构图 为什么在此处使用外观模式呢
定义 RequestFacade 类分别实现 ServletRequest 同时定义私有成员变量 Request 并且方法的实现调用 Request 的实现。然后将 RequestFacade上转为 ServletRequest 传给 servlet 的 service 方法这样即使在servlet中被下转为 RequestFacade 也不能访问私有成员变量对象中的方法。既用了 Request 又能防止其中方法被不合理的访问。