装饰模式

以超市的收银系统为例来学习装饰模式的用法

首先建立一个收银类的接口:

package com.decorator;

public interface Cash {
	public double getCash(String product);
}

然后实现一个具体的收银功能:

package com.decorator;

public class CashImpl implements Cash {

	@Override
	public double getCash(String product) {
		return 10;
	}

}

客户端代码如下:

package com.decorator;

public class Client {
	public static void main(String [] args) {
		Cash cash = new CashImpl();
		System.out.println("香皂的价格:"+ cash.getCash("香皂"));
	}
}

运行客户端后输出结果如下:

香皂的价格:10.0

但是超市经常会遇到打折、赠送等一些活动。当然,通过继承可以增加方法的功能,当需求变动多了之后,继承关系会越来越复杂,如果要修改某一个父类的功能,可能所有的子类都要跟着改动。此时可以用装饰模式来解决这个问题:

增加一个收银的装饰类:

package com.decorator;

public class CashDecorator implements Cash {
	private Cash cash;
	public CashDecorator(Cash cash) {
		this.cash = cash;
	}
	
	@Override
	public double getCash(String product) {
		return cash.getCash(product);
	}

}

增加打折的功能,该功能继承收银的装饰类:

package com.decorator;

public class RebateCash extends CashDecorator {

	public RebateCash(Cash cash) {
		super(cash);
	}
	
	public double getCash(String product) {
		return super.getCash(product) * 0.1;
	}

}

此时修改客户端代码:

package com.decorator;

public class Client {
	public static void main(String [] args) {
		Cash cash = new CashImpl();
		CashDecorator rebateCash = new RebateCash(cash);// 打折
		System.out.println("香皂的价格:"+ rebateCash.getCash("香皂"));
	}
}

运行客户端显示结果如下:

香皂的价格:1.0

这时候,如果超市又想在打完折的基础上再只减0.1,我们也只需要再增加一个具体的装饰类:

package com.decorator;

public class BacktrackCash extends CashDecorator {

	public BacktrackCash(Cash cash) {
		super(cash);
	}

	@Override
	public double getCash(String product) {
		return super.getCash(product) - 0.1;
	}

}

在具体调用的时候再进行组合,此时客户端代码如下:

package com.decorator;

public class Client {
	public static void main(String [] args) {
		Cash cash = new CashImpl();
		CashDecorator rebateCash = new RebateCash(cash);// 先打折
		CashDecorator backtrackCash = new BacktrackCash(rebateCash);// 再减折扣
		System.out.println("香皂的价格:"+ backtrackCash.getCash("香皂"));
	}
}

此时输出结果如下:

香皂的价格:0.9

根据面向对象的设计原则,应该尽量使用组合而不是继承。在这个示例中,装饰模式使用组合的方式替代了多重继承,降低了系统的耦合度。

你可能感兴趣的:(组合,继承,装饰模式)