Java设计模式之装饰器

博客介绍了装饰器模式,其作用是不改变原代码实现新功能,还提及GOF设计模式。通过实现放大器和模拟咖啡两个案例,展示了抽象组件、具体组件、抽象装饰类和具体装饰类的应用,体现了装饰器模式中类与类的关系及赋予源码新功能的特点。

在这里插入图片描述

概述

  • 装饰的作用:不改变原来的代码,就可以实现新的功能
  • GOF设计模式:设计复杂代码时用到的高内聚低耦合的方法论。

1、抽象组件(接口、抽象父类):需要装饰的抽象对象
2、具体组件:要装饰的对象
3、抽象装饰类:包含了对抽象组件的引用,以及装饰着共有的方法
4、具体装饰类:被装饰的对象

1、实现一个放大器

主程序

public static void main(String[] args) {
		Person p = new Person();
		p.say();
		//装饰
		Amplifier am = new Amplifier(p);
		am.say();
	}
	interface Say{
		void say();
	}
}

class Person implements Say{
	//属性:
	private int voice = 10;
	@Override
	public void say() {
		System.out.println("人的声音为:"+this.getVoice());
	}
	public int getVoice() {
		return voice;
	}
	public void setVoice(int voice) {
		this.voice = voice;
	}
}

扩音器(放大器)

class Amplifier implements Say{
	private Person p;  //对人的装饰
	//什么时候装饰,加入构造器中
	Amplifier(Person p){
		this.p=p;
	}
	public void say() {
		System.out.println("人的声音为:"+p.getVoice()*100);
		System.out.println("噪音!!!");
	}
}

结果

在这里插入图片描述

2、模拟咖啡

主程序

public static void main(String[] args) {
		Drink coffee = new Coffee();
		Drink suger = new Suger(coffee); //装饰
		System.out.println(suger.info()+"-->"+suger.cost());
		Drink milk = new Milk(coffee);  //装饰
		System.out.println(milk.info()+"-->"+milk.cost());
		//再混合
		milk = new Milk(suger);   //装饰
		System.out.println(milk.info()+"-->"+milk.cost());
	}

抽象组件

interface Drink{
	double cost();  //费用
	String info();  //说明
}

具体组件

class Coffee implements Drink{
	private String name = "原味咖啡";
	@Override
	public double cost() {
		return 10;
	}
	@Override
	public String info() {
		return name;
	}
}

抽象装饰类

abstract class Decorate implements Drink{
	//对抽象组件的应用
	private Drink drink;
	public Decorate(Drink drink){
		this.drink = drink;
	}
	@Override
	public double cost() {
		return this.drink.cost();
	}
	@Override
	public String info() {
		return this.drink.info();
	}
}

具体抽象类

class Milk extends Decorate{
	public Milk(Drink drink) {
		super(drink);
	}
	//对它们重写
	@Override
	public double cost() {
		return super.cost()*4;
	}
	@Override
	public String info() {
		return super.info()+"加入了牛奶";
	}
}
class Suger extends Decorate{
	public Suger(Drink drink) {
		super(drink);
	}
	//对它们重写
	@Override
	public double cost() {
		return super.cost()*2;
	}
	@Override
	public String info() {
		return super.info()+"加入了蔗糖";
	}
}

结果

在这里插入图片描述
通过两个案例的实践,不难发现,其实装饰器模式体现的就是类与类之间的关系,赋予了源码新的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值