[设计模式](七):外观模式(Fecade)与桥接模式(Bridge)详解

    外观模式(Fecade)与桥接模式(Bridge)都属于结构模式,与之前提到的建造者模式、代理模式、装饰器模式同属一类。

>什么是外观模式?

    要想知道为什么要设计外观模式,就要讲讲它基于的>基本设计原则<:迪米特法则(DP)。

    外观模式是指,通过对内的包装,对外只暴露预定的外观类

    举个例子,对于启动电脑,用户只需要按一下开机键就可以了,而实际上电脑要经过主板过电、硬盘自检、内存过电等操作,而这些操作都被包装起来了,对用户而言,就只有一个按下开机键的动作。

     在抽象层面,子系统类被包装成一个Fecade类,客户类只需要知道Fecade类,而不需要知道复杂的子系统运作方式。听起来有点像建筑模式(Builder),都是把复杂的内容包装起来,以供简单调用。

     其UML图如下:


     外观模式的优点有:

  • 客户与系统解耦,客户对子系统的使用更简单;
  • 便于系统的阅读和理解;
  • 子系统单独的修改不会影响到外观类,符合OCP(开闭原则)
  • 未对子系统进行修改,用户仍可以单独调用某一个子系统。
     相对的,其 缺点也很明显:

  • 客户与系统解耦,却和外观类耦合上了;
  • 由于客户与外观类耦合了,一旦子系统发生增删,外观类也要进行修改,直接违背了OCP(开闭原则);(缓解方法是对外观类进行抽象,但这又容易加大了代码量和冗余)
  • 不完全杜绝客户对子系统的干涉,对敏感系统,可能会造成隐患。

参考:http://blog.csdn.net/hguisu/article/details/7533759

>什么是桥接模式?

     先说一个很抽象的概念吧:桥接模式(Bridge)目的在于把抽象类和实现类解耦,使得二者可以独立变化

     然后我们说一个实际的例子吧:假设我们有一个Shape抽象类,其被继承为正方形类、长方形类等,如果又要定义出红色的正方形、绿色的正方形、红色的长方形等,又要进一步向下继承,UML图如下:


     那么这样,整个系统的类数量就非常大了,这对系统的维护是一个非常大的隐患。假如,我们又要对这个Shape类扩充一个线条类的关系,这下系统中类的数量就会出现立方级别的增长。

    所以,桥接模式就是为了解决这个问题而出现的,其依据的最主要的设计原则是>合成复用原则<。(理解设计原则对理解设计模式非常重要)。

    现在,让我们用桥接模式来解决这个问题:

fun main(arg:Array<String>){
    val mySquare:Shape = Square()
    mySquare.setColor(RedColor())
    mySquare.setLineType(RealLine())
    mySquare.draw() // 输出 Draw Red 正方形 with Real ,桥接成功
}
//第一维度
abstract class Shape{
    lateinit var shapeColor:Color
    lateinit var shapeLineType:LineType

    fun setColor(c:Color){shapeColor=c}
    fun setLineType(lt:LineType){shapeLineType=lt}
    abstract fun draw()
}
//第二维度
interface Color{
    //这里简单用属性值的方式表示
    var color:String
}
//第三维度
interface LineType{
    var lineType:String
}

class RedColor:Color{
    override var color: String ="Red"
}
class RealLine:LineType{
    override var lineType: String = "Real"
}
//抽象类的实现类,实现了桥Bridge
class Square:Shape(){
    //三个维度均被耦合
    override fun draw() {
        println("Draw " + shapeColor.color + " 正方形 with " + shapeLineType.lineType)
    }
}
     其UML图如下:

     可以看到,原版的继承关系全部转化为了>聚合关系<
      参考:http://www.cnblogs.com/chenssy/p/3317866.html

>桥接模式的结构及优缺点

     如图所示:


     桥接模式的优点

  • 用聚合等关联关系代替继承,简化了系统;
  • 桥接模式提高了系统的可扩展性,注意到,对各个维度的扩展均是独立饿。符合OCP(开闭原则)
  • 间接实现了对用户隐藏细节的功能。
     桥接模式的 缺点

  • 理解难度与设计难度得到了提升,在类与类之间的关系进行抽象和建立时,对程序员的要求较高。
  • 弱OCP,对扩展维度的需求必须修改桥Bridge。

     参考:http://www.cnblogs.com/chenssy/p/3317866.html



>>[设计模式]OOP设计模式·目录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值