外发加工网站源码下载,全屋定制营销,网站建设与管理适合女生学吗,网站绑定ftp设计模式—结构型模式之桥接模式
将抽象与实现解耦#xff0c;使两者都可以独立变化。
在现实生活中#xff0c;某些类具有两个或多个维度的变化#xff0c;如图形既可按形状分#xff0c;又可按颜色分。如何设计类似于 Photoshop 这样的软件#xff0c;能画不同形状和不…设计模式—结构型模式之桥接模式
将抽象与实现解耦使两者都可以独立变化。
在现实生活中某些类具有两个或多个维度的变化如图形既可按形状分又可按颜色分。如何设计类似于 Photoshop 这样的软件能画不同形状和不同颜色的图形呢如果用继承方式m 种形状和 n 种颜色的图形就有 m×n 种不但对应的子类很多而且扩展困难。不同颜色和字体的文字、不同品牌和功率的汽车。 桥接将继承转为关联降低类之间的耦合度减少代码量。
桥接Bridge模式包含以下主要角色
系统设计期间如果这个类里面的一些东西会扩展很多这个东西就应该分离出来抽象化Abstraction角色定义抽象类并包含一个对实现化对象的引用。扩展抽象化Refined Abstraction角色是抽象化角色的子类实现父类中的业务方法并通过组合关系调用实现化角色中的业务方法。实现化Implementor角色定义实现化角色的接口供扩展抽象化角色调用。具体实现化Concrete Implementor角色给出实现化角色接口的具体实现。
举例
如果我们有不同型号的手机每种型号的手机都有线下和线上两种销售渠道两种渠道的价格还不同。如果我们不使用设计模式我们就需要定义线上渠道的不同型号手机类、线下渠道的不同型号手机类如果我们再增加一个渠道又需要增加新的不同型号渠道手机类。我们能否把渠道分离出来呢这便引出了桥接模式。
渠道抽象类:
/**
* 抽象渠道类
*/
public abstract class AbstarctChnnel {private String channel;private Integer price;public AbstarctChnnel(String channel, Integer price) {this.channel channel;this.price price;}String getChannelInfo(){return 渠道this.channel \t价格:this.price;}
}线上渠道和线下渠道分别为:
/*** 线上渠道*/
public class OnlineChannel extends AbstarctChnnel{public OnlineChannel(String channel, Integer price) {super(channel, price);}
}
/*** 线下渠道*/
public class OfflineChannel extends AbstarctChnnel{public OfflineChannel(String channel, Integer price) {super(channel, price);}
}我们的抽象手机类如下
public abstract class AbstarctPhone {//桥接在此.....设计期间就得想好//【真正会引起此类变化的一个维度直接抽取出来通过组合的方式接起来】//桥接适配器 ...AbstarctChnnel chnnel;abstract String getPhone();public void setChnnel(AbstarctChnnel chnnel) {this.chnnel chnnel;}
}手机类如下
public class BananaPhone extends AbstarctPhone{OverrideString getPhone() {return 香蕉手机:this.chnnel.getChannelInfo();}
}测试类如下
public class BridgeTest {public static void main(String[] args) {BananaPhone phone new BananaPhone();phone.setChnnel(new OfflineChannel(线下渠道,10000));System.out.println(phone.getPhone() phone.getPhone());}
}运行结果如下 如果我们再新增一个渠道只要再扩展出一个渠道类即可不需要新增手机类。
总结
我们需要把真正会引起此类变化的维度直接抽取出来通过组合的方式拼接起来。