当前位置: 首页 > 编程笔记 >

JAVA装饰者模式(从现实生活角度理解代码原理)

乜烨霖
2023-03-14
本文向大家介绍JAVA装饰者模式(从现实生活角度理解代码原理),包括了JAVA装饰者模式(从现实生活角度理解代码原理)的使用技巧和注意事项,需要的朋友参考一下

装饰者模式可以动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

该模式的适用环境为:

(1)在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

(2)处理那些可以撤消的职责。

(3)当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

实现该模式的关键步骤:

(1)Component(被装饰对象基类):定义对象的接口,可以给这些对象动态增加职责;

(2)ConcreteComponent(具体被装饰对象):定义具体的对象,Decorator可以给它增加额外的职责;

(3)Decorator(装饰者抽象类):维护指向Component实例的引用,定义与Component一致的接口(也就是要继承或实现被装饰对象基类);

(4)ConcreteDecorator(具体装饰者):具体的装饰对象,给内部持有的具体被装饰对象增加具体的职责;

这样讲大家可能有些不好理解,那我们还是老规矩安静:

入冬以后天气越来越冷了,下班之后,做为资深吃货,约上二三好友痛快的来场火锅盛宴再爽不过了。说到火锅,不得不提在成都吃过的大龙燚火锅,各种锅底,配菜应有尽有,但我最喜欢的还是大龙燚火锅原味锅底、麻辣牛肉、大刀毛肚、天味香肠、砣砣牛肉、麻辣排骨等,想想都流口水啊。

说道这大家结合装饰者的实现步骤,应该有点感觉了吧,上文提到的锅底,其实就是被装饰对象的基类,配料其实就是装饰者抽象类,大龙燚火锅原味锅底这些具体的锅底也就是具体的被装饰对象了,麻辣牛肉、大刀毛肚、天味香肠、砣砣牛肉、麻辣排骨这些装饰锅底用的各种配菜也就是具体的装饰对象。说道这,大家应该都豁然开朗了吧,下面我们开始具体的代码实现:

第一步:定义被装饰对象基类(可以是抽象类也可以是接口)

 public interface GuoDi {
   public float cost();//锅底当然要有价钱啦
   public String name();//名字也得有哦
 }

第二步:定义具体被装饰对象(也就是各种锅底,这里定义两种)

public class YuanYang implements GuoDi {
  @Override
  public float cost() {
    return 48.0f;
  }
  @Override
  public String name() {
    return "鸳鸯锅底";
  }
}
public class DaLongYan implements GuoDi{
  @Override
  public float cost() {
    return 59.0f;
  }
  @Override
  public String name() {
    return "大龙燚火锅原味锅底";
  }
}

第三步:定义装饰者抽象类

public abstract class PeiCai implements GuoDi {
  private GuoDi guodi;
  public FoodDecorator(GuoDi guodi) {
    super();
    this.guodi = guodi;
  }
  @Override
  public float cost() {
    return guodi.cost();
  }
  @Override
  public String name() {
    return guodi.name();
  }
}

第四步:定义具体的装饰者对象

public class MaLaNiuRou extends PeiCai {
  public MaLaNiuRou(GuoDi guodi) {
    super(guodi);
  }
  @Override
  public float cost() {
    return super.cost()+46f;
  }
  @Override
  public String name() {
    return super.name()+"+麻辣牛肉";
  }
}
public class MaoDu extends PeiCai {

  public MaoDu(GuoDi guodi) {
    super(guodi);
  }
  @Override
  public float cost() {
    return super.cost()+30f;
  }
  @Override
  public String name() {
    return super.name()+"+大刀毛肚";
  }
}

测试类:

public class Test {
  public static void main(String[] args) {
    GuoDi guodi = new DaLongYan ();//点个大龙燚火锅原味锅底
    MaLaNiuRou y = new MaLaNiuRou(guodi);//来个麻辣牛肉
    MaoDu x = new MaoDu(y);//在麻辣牛肉的基础上再来个大刀毛肚
    System.out.println("一共点了"+x.name()+",共消费"+s.cost());
  }
}

输出结果:

 1 一共点了大龙燚火锅原味锅底+麻辣牛肉+大刀毛肚,共消费135

以上所述是小编给大家介绍的JAVA装饰者模式(从现实生活角度理解代码原理),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐喊html" target="_blank">教程网站的支持!

 类似资料:
  • 本文向大家介绍JAVA简单工厂模式(从现实生活角度理解代码原理),包括了JAVA简单工厂模式(从现实生活角度理解代码原理)的使用技巧和注意事项,需要的朋友参考一下 简单工厂模式(Simple Factory),说他简单是因为我们可以将此模式比作一个简单的民间作坊,他们只有固定的生产线生产固定的产品。也可以称他为静态工厂设计模式,类似于之前提到过静态代理设计模式,一条生产线生产一种产品(一个代理代理

  • 本文向大家介绍Java装饰者模式实例详解,包括了Java装饰者模式实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java装饰者模式。分享给大家供大家参考,具体如下: 装饰模式 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。装饰对象可以在转发这些

  • 本文向大家介绍PHP设计模式之装饰者模式代码实例,包括了PHP设计模式之装饰者模式代码实例的使用技巧和注意事项,需要的朋友参考一下 定义: 装饰者模式就是不修改原类代码和继承的情况下动态扩展类的功能。传统的编程模式都是子类继承父类实现方法重载,使用装饰器模式,只需添加一个新的装饰器对象,更加灵活,避免类数量和层次过多。 角色: Component(被装饰对象基类) ConcreteComponen

  • 本文向大家介绍java 装饰模式(Decorator Pattern)详解及实例代码,包括了java 装饰模式(Decorator Pattern)详解及实例代码的使用技巧和注意事项,需要的朋友参考一下 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来

  • 有时我们不希望某个类天生就非常庞大,一次性包含许多职责。那么我们就可以使用装饰者模式。 装饰者模式可以动态地给某个对象添加一些额外的职责,从而不影响这个类中派生的其他对象。 装饰者模式将一个对象嵌入另一个对象之中,实际上相当于这个对象被另一个对象包装起来,形成一条包装链。 一、不改动原函数的情况下,给该函数添加些额外的功能 1. 保存原引用 window.onload = function() {

  • 装饰者模式可以动态的给指定的类添加一些行为和职责,而不用对原代码进行任何修改。当你需要使用子类的时候,不妨考虑一下装饰者模式,可以在原始类上面封装一层。 在 Swift 里,有两种方式实现装饰者模式:扩展 (Extension) 和委托 (Delegation)。