关于装饰者模式的开发理解

来源:互联网 发布:天谕流光男性捏脸数据 编辑:程序博客网 时间:2024/05/16 20:58

java开发模式中的装饰者模式:
对于很多初学者而言,装饰者模式是一个难点,本人也是最近才对其有所感悟。特意写下此文,与大家探讨,所谓每个人心中都有一个哈姆雷特,所以文章不足之处和与大家想法有所出入的地方,希望读者多多指导共同进步。
假定场景是这样的:你需要去买一个饼,那么卖家会给你提供一个很简单的没有任何增值的饼。此时这个饼的价格为5元。但是,如果你需要加鸡蛋(2元),加火腿(1元),那么最终你获得的饼的价格为5+2+1,即8元。在代码中如何让这个场景实现呢?
1.装饰者模式的前提是有一个你所需要装饰的对象,那么久必须要有一个类来支持这个对象。我在这里将其称之为饼类(Bing.class)其继承了食物这个抽象类或者接口且实现了食物的成员函数price()。
class Bing extends food {
pbulic void price (){
system.out.print(“饼的价格为5元”);
}
}
2.装饰者模式中的装饰物(鸡蛋、火腿)其必须也要实现食物这个抽象类或者接口,并实现其中的price()方法;
//同理写出火腿的类
class Egg extends food{
Bing bing = bing;//持有被装饰的对象
Egg(Bing bing){
this.bing = bing;
}
public void price(){
//调用饼的中的同名方法;所谓的方法增强(如果继承的是饼类就可以这么说)。
bing.price();
system.out.print(“鸡蛋的价格为2元”);
}
}
3.测试类;
class Test {
public static void main(String args[]){
//创建饼的对象
Bing bing = new Bing ;
//利用鸡蛋对饼进行装饰;
Egg egg = new Egg(bing);
egg.price();
}
}

从以上的代码,我个人理解为装饰者模式就是利用一个类去对另外一个类(类中的函数)进行加强,或者就是完全的替代那个被装饰的类。但是我们必须要拥有这个被装饰的类的对象。因为我们需要在装饰类中调用这个类的原来的处理函数,与此同时,我们再对这个函数进行增强操作。所以,所谓的装饰者模式。就是利用现有的类来包含原有的类。


错误的思想如下(这是我再次求证后发现我的之前的观点是错误的),
之前的观点:
那么我们是否需要在装饰者模式中不继承或者实现被继承者所实现的父类或者接口呢?
因为我们仅仅只需要拿到被继承类的对象就可以了。
也就是我自己定义一个类,在构造函数中传入这个被继承的对象。并写一个函数调用这个被继承者的函数。同样也可以实现以上的代码。
class Demo {
Bing bing;
Demo(bing){
this.bing = bing;
}
public void myMethod(){
bing.price();
system.out.print(“这是我自己的函数,不要钱0元”);
}
}
不知道这个算不算装饰者模式的实现。
以上观点纯属个人臆想。不足之处还望各位多多指点。
解释:
因为装饰者模式装饰的是一个接口或者父类下的所有子类,而且也可以被自己装饰,
所以在装饰者类中的构造函数传递的是被装饰类的父类的引用,但是指向的是子类的对象,(也就是所谓的多态),只有这样才可以对一个父类的所有的子类进行装饰。
所以逆向推理可以得出的结论是我们必须实现父级接口或是继承父类。

0 0