前一段时间写过关于机房重构的七层架构,里面包含一个外观层,机房重构也敲了好长时间了,却始终不太清楚,这个外观模式到底有什么作用?大家都敲过机房收费系统,知道在这个系统中一般都只涉及到一个表,结构相对来说比较简单,所以这样给我自己的一个困惑,就是用不用外观模式貌似没有什么区别。那么在七层架构中为什么还要有外观设计模式的存在?
其实在这个问题的前提,是我还不能清楚的解释外观模式是怎样的一个设计模式,产生的背景,定义,运用的好处,以及缺点吧。不总结一下,永远不知道掌握多少,尝试总结一下。
首先一张图反映一个混乱的系统,阐述外观产生背景
正是因为系统的混乱,不利于后期的维护,所以有了外观模式。加入外观模式之后的系统。
是不是瞬间清晰很多,所以尝试着使用设计模式,它会帮助我们更好的工作。
为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
下面用一个程序说明问题
class SubSystemA { public void MethodA() { //业务实现代码 } } class SubSystemB { public void MethodB() { //业务实现代码 } } class SubSystemC { public void MethodC() { //业务实现代码 } }使用外观模式,代码编写如下
class Facade { private SubSystemA obj1 = new SubSystemA(); private SubSystemB obj2 = new SubSystemB(); private SubSystemC obj3 = new SubSystemC(); public void Method() { obj1.MethodA(); obj2.MethodB(); obj3.MethodC(); } }
class Program { static void Main(string[] args) { Facade facade = new Facade(); facade.Method(); } }
class Program { static void Main(string[] args) { SubSystemA a1=new SubSystemA (); SubSystemB b1=new SubSystemB (); SubSystemC c1 = new SubSystemC(); a1.MethodA(); b1.MethodB(); c1.MethodC(); Console.Read(); } }这是连接子系统较少,想象一下如果我们连接数十个子系统,这还指不定是怎样一锅乱粥了。。 所以用户在面对程序的时候,只需要一个按钮就可以完成所有的事情,这样方便程序有谁能不喜欢使用!
看完了图和代码,具体总结一下,外观模式到底有什么好处!
1、引入外观模式,是客户对子系统的使用变得简单了,减少了与子系统的关联对象,实现了子系统与客户之间的松耦合关系。
2、只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类。
3、降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程。
事物都有两面性,所以外观模式同样,如果乱用,也会给我们带来很大的困扰。说说设计模式的缺点吧。
1、不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性
2、在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”
1、当要为一个复杂子系统提供一个简单接口时可以使用外观模式。
2、客户程序与多个子系统之间存在很大的依赖性。引入外观类将子系统与客户以及其他子系统解耦,可以提高子系统的独立性和可移植性。
外观模式的主要目的就是为程序做到解耦合,减少程序与仔细与子系统之间存在的很大的依赖性。如果需要实现一个外观模式,需要将子系统组合进外观中,然后将工作委托给外观执行。最大的缺点就是违背了开放封闭原则。
如有理解偏颇之处,还请各位大神斧正,不胜感激!