面向对象的设计模式(三)——Bridge模式

 2. Bridge 桥模式

◆  动机:

        由于某些类型的固有的实现逻辑,使得他们具有两个变化的维度,乃至多个维度的变化。如何应对这种“多维度的变化”?如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个反向变化,而不引入额外的复杂度?

我们还是先上代码:

abstract class Messager {

    public abstract void login(String username, String password);

    public abstract void sendMessage(String message);

    public abstract void sendPicture(Image image);


    public abstract void playSound();

    public abstract void drawShape();

    public abstract void writeText();

    public abstract void connect();

}


//这种方式的类数:1+n+n*m =1+5+5*5= 31

//平台实现
abstract class PCMessagerBase extends Messager {


    @Override
    public void playSound() {
        //**********
    }

    @Override
    public void drawShape() {
        //**********
    }

    @Override
    public void writeText() {
        //**********
    }

    @Override
    public void connect() {
        //**********
    }

}


abstract class MobileMessagerBase extends Messager {


    @Override
    public void playSound() {
        //==========
    }

    @Override
    public void drawShape() {
        //==========
    }

    @Override
    public void writeText() {
        //==========
    }

    @Override
    public void connect() {
        //==========
    }

}


//业务抽象
class PCMessagerLite extends PCMessagerBase {
    @Override
    public void login(String username, String password) {
        super.connect();
        //........
    }

    @Override
    public void sendMessage(String message) {
        super.writeText();
        //........
    }

    @Override
    public void sendPicture(Image image) {
        super.drawShape();
        //........
    }
}


class PCMessagerPerfect extends PCMessagerBase {
    @Override
    public void login(String username, String password) {
        super.playSound();
        //********
        super.connect();
        //........
    }

    @Override
    public void sendMessage(String message) {
        super.playSound();
        //********
        super.writeText();
        //........
    }

    @Override
    public void sendPicture(Image image) {
        super.playSound();
        //********
        super.drawShape();
        //........
    }
}


class MobileMessagerLite extends MobileMessagerBase {
    @Override
    public void login(String username, String password) {
        super.connect();
        //........
    }

    @Override
    public void sendMessage(String message) {
        super.writeText();
        //........
    }

    @Override
    public void sendPicture(Image image) {
        super.drawShape();
        //........
    }
}


class MobileMessagerPerfect extends MobileMessagerBase {
    @Override
    public void login(String username, String password) {
        super.playSound();
        //********
        super.connect();
        //........
    }

    @Override
    public void sendMessage(String message) {
        super.sendMessage(message);
        //********
        super.writeText();
        //........
    }

    @Override
    public void sendPicture(Image image) {
        super.playSound();
        //********
        super.drawShape();
        //........
    }
}


class Client {

    public static void main(String args[]) {

        //编译时装配
        Messager m = new MobileMessagerPerfect();
    }
}
这段代码的逻辑结构如下:

但是,我们发现PCMessagerLite类和MobileMessagerLite类中的代码基本上是一样的,PCMessagerPerfect类和MobileMessagerPerfect类的代码也是一样的,所以我们要进行优化。想到前面学的Decorator模式,同样的,我们要把不同情况时不同的类组合到一个动态类里面去。但是要实现一个抽象类就要实现它的所有方法,这里MessagerLite是不能实现Messager的所有方法的(有一部分完全用不到),我们发现Messager中的方法其实具有两个变化的维度,那么我们就把Messager分成两个类(职责划分)。然后再在用Decorator的思路去组合,下面是优化之后的代码:

abstract class Messager {


    protected MessagerImp msgImp;


    protected  Messager(MessagerImp msgImp){
        this.msgImp=msgImp;
    }

    public abstract void login(String username, String password);
    public abstract void sendMessage(String message);
    public abstract void sendPicture(Image image);

}

abstract class MessagerImp{

    public abstract void playSound();
    public abstract void drawShape();
    public abstract void writeText();
    public abstract void connect();
}


//1+1+n+m =1+1+5+5= 12

//平台实现
class PCMessagerImp extends MessagerImp {


    @Override
    public void playSound() {
        //**********
    }

    @Override
    public void drawShape() {
        //**********
    }

    @Override
    public void writeText() {
        //**********
    }

    @Override
    public void connect() {
        //**********
    }

}


class MobileMessagerImp extends MessagerImp {


    @Override
    public void playSound() {
        //==========
    }

    @Override
    public void drawShape() {
        //==========
    }

    @Override
    public void writeText() {
        //==========
    }

    @Override
    public void connect() {
        //==========
    }

}


//业务抽象
class MessagerLite extends Messager  {


    @Override
    public void login(String username, String password) {
        msgImp.connect();
        //........
    }

    @Override
    public void sendMessage(String message) {
        msgImp.writeText();
        //........
    }

    @Override
    public void sendPicture(Image image) {
        msgImp.drawShape();
        //........
    }
}


class MessagerPerfect extends Messager {



    @Override
    public void login(String username, String password) {
        msgImp.playSound();
        //********
        msgImp.connect();
        //........
    }

    @Override
    public void sendMessage(String message) {
        msgImp.playSound();
        //********
        msgImp.writeText();
        //........
    }

    @Override
    public void sendPicture(Image image) {
        msgImp.playSound();
        //********
        msgImp.drawShape();
        //........
    }
}






class Client {

    public static void main(String args[]) {

        //编译时装配
        Messager m = new MessagerPerfect( new PCMessagerImp());
    }
}
优化后的逻辑结构如下图:

◆ 模式定义:

        将抽象部分(本例中的业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化。

◆ 结构:

        注意,图中虚线就代表一个指针,这里指向一个MessagerImp,就是下面这段代码的实现。

protected MessagerImp msgImp;

    protected  Messager(MessagerImp msgImp){
        this.msgImp=msgImp;
    }


◆ 要点总结:

        ●  Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着格子的维度来变化。所谓抽象和实现沿着各自维度的变化,即“子类化”他们;

        ●  Bridge模式有时候类似于多继承方案,但是多继承方案往往违背单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法;

        ●  Bridge模式的应用一般在“两个非常强的变化维度”,有时一个类也有多于两个的变化维度,这时可以使用Bridge的扩展模式;








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
桥梁模式Bridge)是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立变化。这种模式通过委托的方式将两个层次结构连接起来,从而减少它们之间的耦合度。 在C#中实现桥梁模式,首先需要定义抽象部分和实现部分的接口或抽象类。然后在抽象部分中持有一个指向实现部分的引用,并通过该引用将实现部分的具体实现委托给实现部分。 下面是一个简单的示例代码: ```csharp // 实现部分的接口 interface IImplementor { void OperationImpl(); } // 具体实现部分A class ConcreteImplementorA : IImplementor { public void OperationImpl() { Console.WriteLine("Concrete Implementor A"); } } // 具体实现部分B class ConcreteImplementorB : IImplementor { public void OperationImpl() { Console.WriteLine("Concrete Implementor B"); } } // 抽象部分的接口 interface Abstraction { void Operation(); } // 具体抽象部分 class RefinedAbstraction : Abstraction { private IImplementor implementor; public RefinedAbstraction(IImplementor implementor) { this.implementor = implementor; } public void Operation() { implementor.OperationImpl(); } } // 使用示例 class Program { static void Main(string[] args) { IImplementor implementorA = new ConcreteImplementorA(); Abstraction abstractionA = new RefinedAbstraction(implementorA); abstractionA.Operation(); // Output: Concrete Implementor A IImplementor implementorB = new ConcreteImplementorB(); Abstraction abstractionB = new RefinedAbstraction(implementorB); abstractionB.Operation(); // Output: Concrete Implementor B } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值