设计模式——装饰模式

设计模式——装饰模式

本文个人博客地址:https://abeille.top/blog/detail/AT824ZB0N

装饰模式(Decorator Pattern):是指在不改变原有对象的基础上,以对客户端透明的方式扩展::对象::、修改原有对象的功能,是继承关系的一种替代方案;它可以在不创建更多子类的情况下进行子类的扩展;装饰模式把客户端的调用委派到被装饰类;

Collections有三组装饰器方法,它们的返回对象都没有新的方法或属性,但改变了原有接口方法的性质,经过装饰后更加安全(写安全、类型安全(确保容器中不会保存错误类型的对象)、线程安全);

装饰模式适用场景:

  • 扩展一个类的功能或给一个类添加附加职责;
  • 动态给一个对象添加功能,这些功能可以再动态撤销;

装饰模式的角色:

  1. 抽象构建角色(Component):给出一个抽象接口,以规范准备接受附加功能的对象;
  2. 具体构建角色(Concrete Component):定义一个将要接受附加功能的类;
  3. 装饰角色(Decorator):持有一个构建对象的引用,并定义一个与抽象构建接口一致的接口;
  4. 具体装饰角色(Concrete Decorator):给构建对象附加功能;

装饰模式使用示例:
创建一个煎饼抽象类:

public abstract class Battercake {
     
 String getMsg();
 int getPrice();
}

创建基本的煎饼类:

public class BaseBattercake extends Battercake {
     
 @Override
 public String getMsg () {
     
  return “煎饼”;
 }
 @Override
 public int getPrice () {
     
  return 5;
 }
} 

创建扩展套餐的抽象装饰类:

public abstract class BattercakeDecorator extends Battercake {
     
 private Battercake battercake;

 public BattercakeDecorator (Battercake battercake) {
     
  this.battercake = battercake;
 }

 @Override
 public String getMsg () {
     
  return this.battercake.getMsg();
 }
 @Override
 public int getPrice () {
     
  return this.battercake.getPrice();
 }
}

创建鸡蛋套餐装饰类:

public abstract class EggDecorator extends BattercakeDecorator {
     
 private Battercake battercake;

 public EggDecorator (Battercake battercake) {
     
  this.battercake = battercake;
 }

 @Override
 public String getMsg () {
     
  return super.getMsg() ++ 1个鸡蛋”;
 }
 @Override
 public int getPrice () {
     
  return super.getPrice() + 1.5;
 }
}

创建香肠套餐装饰类:

public abstract class SausageDecorator extends BattercakeDecorator {
     
 private Battercake battercake;

 public SausageDecorator (Battercake battercake) {
     
  this.battercake = battercake;
 }

 @Override
 public String getMsg () {
     
  return super.getMsg() ++ 1个鸡蛋”;
 }
 @Override
 public int getPrice () {
     
  return super.getPrice() + 1.5;
 }
}

调用示例:

public class DecoratorExample {
     
 public static void main (String[] args) {
     
  Battercake battercake = new BaseBattercake();
  // 扩展一下
  battercake = new EggDecorator(battercake);
  // 再扩展一下
  battercake = new SausageDecorator(battercake);
  System.out.println(battercake.getMsg() +, 价格:” + battercake.getPrice());
 }
} 

你可能感兴趣的:(设计模式,设计模式,java)