桥接模式
1.实例
要用程序模拟出操作手机的过程,手机有不同的品牌不同的形状。
2.传统方式解决
这样处理有很多的弊端,使程序扩展性减弱,进行扩展时,会产生很多不必要的代码,从图中可以看出,各种品牌因为形状不同而出现了多次 => 可以使用桥接模式解决
3.桥接模式基本介绍
-
将实现和抽象放在两个不同的类层次中,是两个层次可以独立改变
-
结构型设计模式
-
基于类最小设计原则,通过使用封装,聚合以及继承等行为让不同的类承担不同的职责。把抽象和行为实现分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展
3.使用桥接模式解决问题
根据桥接模式,我们可以将手机的分离开来,手机含有手机品牌和具体的形状,而手机的形状可以作为手机的直接子类,手机品牌可以作为接口,由具体的手机品牌进行实现。类图如下
代码实现:
Phone抽象类
/**
* @Author: LySong
* @Date: 2020/3/26 13:34
*/
public abstract class Phone {
private Brand brand;
public Phone(Brand brand) {
this.brand = brand;
}
protected void open(){
this.brand.open();
}
protected void close(){
this.brand.close();
}
protected void call(){
this.brand.call();
}
}
手机品牌接口
/**
* @Author: LySong
* @Date: 2020/3/26 13:31
*/
public interface Brand {
void call();
void close();
void open();
}
具体手机品牌:
/**
* @Author: LySong
* @Date: 2020/3/26 13:33
*/
public class XiaoMi implements Brand {
@Override
public void call() {
System.out.println("小米手机打电话");
}
@Override
public void close() {
System.out.println("小米手机关机");
}
@Override
public void open() {
System.out.println("小米手机开机了");
}
}
/**
* @Author: LySong
* @Date: 2020/3/26 13:32
*/
public class HuaWei implements Brand {
@Override
public void call() {
System.out.println("华为手机打电话");
}
@Override
public void close() {
System.out.println("华为手机关机");
}
@Override
public void open() {
System.out.println("华为手机开机");
}
}
手机的形状
/**
* 折叠手机类
* @Author: LySong
* @Date: 2020/3/26 13:35
*/
public class UpRightPhone extends Phone {
public UpRightPhone(Brand brand) {
super(brand);
}
public void open(){
super.open();
System.out.println("直立手机");
}
public void close(){
super.close();
System.out.println("直立手机");
}
public void call(){
super.call();
System.out.println("直立手机");
}
}
/**
* 折叠手机类
* @Author: LySong
* @Date: 2020/3/26 13:35
*/
public class FoldedPhone extends Phone {
public FoldedPhone(Brand brand) {
super(brand);
}
public void open(){
super.open();
System.out.println("折叠手机");
}
public void close(){
super.close();
System.out.println("折叠手机");
}
public void call(){
super.call();
System.out.println("折叠手机");
}
}
/**
* @Author: LySong
* @Date: 2020/3/26 13:39
*/
public class Client {
public static void main(String[] args) {
//获取折叠式手机(样式+品牌)
Phone phone = new FoldedPhone(new XiaoMi());
phone.open();
phone.call();
phone.close();
Phone phone1 = new FoldedPhone(new HuaWei());
phone1.open();
phone1.call();
phone1.close();
Phone phone2 = new UpRightPhone(new XiaoMi());
phone2.open();
phone2.call();
phone2.close();
}
}