设计模式桥接模式-装饰者模式
- 桥接模式
-
基本介绍:
- 桥接模式是指:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。
- 是一种结构型设计模式
- Bridge模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类继承承担不同的职责。它的主要特点是把抽象与行为实现分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。
-
代码
public interface Brand { void open(); void close(); void call(); } public class Vivo implements Brand { @Override public void open() { System.out.println("vivo手机开机了"); } @Override public void close() { System.out.println("vivo手机开机了"); } @Override public void call() { System.out.println("vivo手机开机了"); } } public class XiaoMi implements Brand { @Override public void open() { System.out.println("小米手机开机了"); } @Override public void close() { System.out.println("小米手机关机了"); } @Override public void call() { System.out.println("小米手机打电话"); } } public abstract class Phone { private Brand brand; public Phone(Brand brand) { this.brand = brand; } protected void open() { brand.open(); } protected void close() { brand.close(); } protected void call() { brand.call(); } } 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("折叠样式手机"); } } 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("直板样式手机"); } } public class Client { public static void main(String[] ages) { FoldedPhone foldedPhone=new FoldedPhone(new XiaoMi()); foldedPhone.open(); foldedPhone.close(); foldedPhone.call(); } }
-
桥接模式的注意事项和细节
- 实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从而产生更好的结构化系统。
- 对于系统的高层部分,只需要知道抽象部分和实现部分的接口借可以了,其他的部分由具体业务来完成。
- 桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本。
- 桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。
- 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性,即需要这样的应用场景。
-
桥接模式其他应用场景
- 对于那些不希望使用继承或因为多层次继承导致系统类的个数急速增加的系统,桥接模式尤其使用。
- 常见的应用场景:
- jdbc驱动程序
- 银行转账系统:
- 转账分类:网上转账,柜台转账,ATM转账
- 转账用户类型:普通用户,银卡用户,金卡用户
- 消息管理
- 消息类型:即时消息,延时消息
- 消息分类:手机短信,邮件消息,QQ消息。。。
-
- 装饰者模式
-
基本介绍
- 装饰者模式:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更加有弹性,装饰者模式也体现了开闭原则。
-
代码
public abstract class Drink { private String des;//描述 private float price =0.0f; public String getDes() { return des; } public void setDes(String des) { this.des = des; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } //计算费用的方法需要子类去实现 public abstract float cost(); } public class Coffee extends Drink{ @Override public float cost() { return super.getPrice(); } } public class Espresso extends Coffee { public Espresso(){ setDes("浓咖啡"); setPrice(6.0f); } } public class LongBlack extends Coffee { public LongBlack(){ setDes("longBlack"); setPrice(5.0f); } } public class ShortBlack extends Coffee { public ShortBlack(){ setDes("shortBlack"); setPrice(4.0f); } } public class Decorator extends Drink { private Drink drink; public Decorator(Drink drink) { this.drink = drink; } @Override public float cost() { return super.getPrice()+drink.cost(); } @Override public String getDes() { return super.getDes()+super.getPrice()+"&&"+drink.getDes(); } } //具体的Decorator类具体的调味品 public class Milk extends Decorator { public Milk(Drink drink) { super(drink); setDes("牛奶"); setPrice(2.0f);//调味品的价格 } } //具体的Decorator类具体的调味品 public class Soy extends Decorator { public Soy(Drink drink) { super(drink); setDes("豆浆"); setPrice(1.5f);//调味品的价格 } } //具体的Decorator类具体的调味品 public class Chocolate extends Decorator { public Chocolate(Drink drink) { super(drink); setDes("巧克力"); setPrice(3.0f);//调味品的价格 } } public class CoffeeBar { public static void main(String[] args) { //装饰者模式下的订单:2份巧克力+一份牛奶的LongBlack //1.点一份longblack Drink order=new LongBlack(); System.out.println("LongBlack订单的描述:"+order.cost()); System.out.println("LongBlack订单的价格:"+order.getDes()); order=new Milk(order); System.out.println("LongBlack+一份牛奶订单的描述:"+order.cost()); System.out.println("LongBlack+一份牛奶订单的描述:"+order.getDes()); order=new Chocolate(order); System.out.println("LongBlack+一份牛奶+一份巧克力订单的描述:"+order.cost()); System.out.println("LongBlack+一份牛奶+一份巧克力订单的描述:"+order.getDes()); order=new Chocolate(order); System.out.println("LongBlack+一份牛奶+两份份巧克力订单的描述:"+order.cost()); System.out.println("LongBlack+一份牛奶+两年份巧克力订单的描述:"+order.getDes()); } }
-