初识装饰模式,根据代码来总结总结,积累起来。

这是这个星期刚学习的装饰模式,我来写写自己理解的装饰模式。

    首先什么是装饰模式:装饰模式又称“包装器”,为什么说他是包装器呢,等下你看到我等会写的代码就知道了。装饰模式是在不需要改变原始代码的情况下,动态地扩展一个对象的功能。这是符合设计模式的基本原则之一:多扩展,少修改。

装饰模式包括那几部分呢?

 

    装饰模式包括四部分:

               1、抽象组件:是个抽象的类,里面定义了被装饰者装饰方法。

               2、具体组件:是抽象组件的子类,具体组件的实例被称为 被装饰者。

               3、装饰:首先装饰也是抽象组件的一个子类,装饰里面包含一个抽象组件的一个成员变量用来保存“被装饰者的引用”,特别的是:装饰可以是个abstract的也可以是非abstract的,如果是非abstract的,那麽该类的实例被称为装饰者。

               4、具体装饰:是装饰的子类,可以有多个,具体装饰的实例被称作装饰者。根据我自己的看法,每一个具体装饰,就是需要扩展的功能。

那麽装饰模式怎么用呢?

    就根据食堂的非常常见的掉渣饼来说,饼是一个抽象组件,而掉渣饼就是饼的一个子类,具体实例。 装饰是什么呢,就是饼里面加的 烤肠,煎蛋,生菜等等一切可以加的东西,而这些加进去的东西就是装饰的具体实例,也就是子类。这样一说是不是有点内味了,懂了一点了。(我也是初识,你来看,我可能是以学生的视角来给你讲,就相当于倒数第一突然明白一点,来给倒数第二讲一下倒数第一的豁然开朗。)

    接着说,刚才上面提到装饰者可以有很多个,就是对应这个些 烤肠、煎蛋、生菜来说的,每当你需要往里面加一点东西,就需要去创建一个子类来作为一个你所需要扩展的功能。

    ---------------------------------------------------------------到这里了,是否已经明白了一丢丢了--------------------------------------------------

    接下来上代码:

    下面是实现掉渣饼的价钱,加什么东西给什么价钱,在对象的基础上互相叠加使用功能,自由组合。

package DecoratorBing;
//抽象组件:Bing
public abstract class Bing {
	public abstract double price(); //方法.

}
----------------------------------------------------------------------
package DecoratorBing;
//具体组件:也就是上面Bing的实例
public class DZBing extends Bing {
	public final double  PRICE=3.0;

	@Override
	public double price() {          //父类具体方法实现。
		// TODO Auto-generated method stub
		return PRICE;
	}

}
---------------------------------------------------------------------
package DecoratorBing;
//装饰者:也是Bing的子类。
public abstract class Decortor extends Bing{
	Bing bing ;
	public Decortor() {}
	public Decortor(Bing bing) {   //给成员变量赋值的
		this.bing=bing ;
	}
	public double price() {    //父类方法的实现
		// TODO Auto-generated method stub
		return 0;
	}
}
-----------------------------------------------------------------------
package DecoratorBing;
//装饰者:装饰的子类,第一个功能加煎蛋
public class JianDan extends Decortor {
	private final  double PRICE=1.0;
	public JianDan(Bing bing ) {
		super(bing);  //继承父类的方法
	}
	public double price() {
		// TODO Auto-generated method stub
		return bing.price()+Addprice();
	}
	private double Addprice() {
		return PRICE;
	}
}
--------------------------------------------------------------------------
package DecoratorBing;
//第二个子类,功能:加烤肠
public class KaoChang extends Decortor {
	private final double PRICE=1.5;
	public KaoChang(Bing  bing) {
		super(bing);
	}

	@Override
	public double price() {
		// TODO Auto-generated method stub
		return bing.price()+Addprice();
	}
	public double Addprice() {
		return PRICE;
	}

}
----------------------------------------------------------------------------
package DecoratorBing;
//第三个子类,功能:加生菜
public class ShengCai extends Decortor {
	private final double PRICE=0.5;
	public ShengCai(Bing  bing) {
		super(bing);
	}

	@Override
	public double price() {
		// TODO Auto-generated method stub
		return bing.price()+Addprice();
	}
	public double Addprice() {
		return PRICE;
	}

}
-----------------------------------------------------------------------
//Mai方法,来执行
package DecoratorBing;

public class APPlication {
	public static void main(String[] args) {
		Bing bing=new DZBing();//创建被装饰对象
//下面是功能实现,可以互相实现。
		System.out.println("白饼子的价格"+bing.price());
		Bing bing1=new JianDan(bing);
		System.out.println("加煎蛋的价格"+bing1.price());
		Bing bing2=new KaoChang(bing1);
		System.out.println("加了煎蛋和烤肠的价格:"+bing2.price());
		Bing bing3=new ShengCai(bing2);
		System.out.println("加了烤肠煎蛋生菜的价格:"+bing3.price());
	}
}

最后希望这篇文章能帮助初学的你,希望有帮助的话点个赞,有什么需要改正请你在下面评论,让我积极发现,改正,大家一起进步,你的指点,就是我进步的动力。

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值