设计模式学习(七) 桥接模式
场景:
-- 商场系统中常见的商品分类,以电脑为类,如何出来好商品分类销售的问题?
如图:
我们该如何实现上图的关系?
1:我们可以用多层继承接口实现
2:桥接模式实现
使用第一种的问题:
- 扩展性问题(类个数膨胀问题):
如果要增加一个新的电脑类型智能手机,则要增加各个品牌下面的类
如果要增加一个新的品牌,也要增加各种电脑类型的类
- 违反单一职责原则
一个类:联想笔记本,有两个引起这个变化的原因
使用第二种实现:
代码:
package com.lp.bridge; public interface Brand { void sale(); } class Lenovo implements Brand{ @Override public void sale() { System.out.println("销售联想电脑"); } } class Dell implements Brand{ @Override public void sale() { System.out.println("销售戴尔电脑"); } }
package com.lp.bridge; /*电脑的维度*/ public class Computer { protected Brand brand; public Computer(Brand brand){ this.brand = brand; } public void sale(){ brand.sale(); } } class Desktop extends Computer{ public Desktop(Brand brand) { super(brand); // TODO Auto-generated constructor stub } @Override public void sale() { // TODO Auto-generated method stub super.sale(); System.out.println("销售台式机"); } } class Laptop extends Computer{ public Laptop(Brand brand) { super(brand); // TODO Auto-generated constructor stub } @Override public void sale() { // TODO Auto-generated method stub super.sale(); System.out.println("销售笔记本"); } }
package com.lp.bridge; public class Client { public static void main(String[] args){ Computer c = new Laptop(new Lenovo()); c.sale(); } }
优点:
-- 桥接模式可以取代多层继承的方法。多层继承违背了单一职责原则,复用性较差,类的个数也非常多。桥接模式可以极大的减少子类的个数,从而降低管理和维护的成本
-- 桥接模式极大的提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有的系统,符合开闭原则使用场景: