其他分享
首页 > 其他分享> > 装饰者模式简述

装饰者模式简述

作者:互联网

装饰者模式

注意
要实现装饰者模式,注意以下几点内容:
a.装饰者类要实现真实类同样的接口
b.装饰者类内有一个真实对象的引用(可以通过装饰者类的构造器传入)
c.装饰者类对象在主类中接受请求,将请求发给真实的对象(相当于已经将引用传递到了装饰类的真实对象)
d.装饰者可以在传入真实对象后,增加一些附加功能(因为装饰对象和真实对象都有同样的方法,装饰对象可以添加一定的操作在调用真实对象的方法,或者先调用真实对象的方法,再添加自己的方法)
e.不用继承
示例
package waking.test.zs;
/**
 * 馒头的接口
 * @author waking
 *
 */
public interface IBread {
	void prepare();//准备
	
	void kneadFlour();//和面
	
	void steamed();//蒸面
	
	void process();//处理
	
}
package waking.test.zs;
/**
 * 正常实现馒头
 * @author waking
 *
 */
public class NormaIBread implements IBread {

	@Override
	public void prepare() {
		System.out.println("开始准备工作、、、、");
	}

	@Override
	public void kneadFlour() {
		System.out.println("开始和面、、、、、");
	}

	@Override
	public void steamed() {
		System.out.println("开始蒸馒头、、、、");
	}

	@Override
	public void process() {
		prepare();
		kneadFlour();
		steamed();
	}

}
package waking.test.zs;
/**
 * 加工馒头抽象类
 * @author waking
 *
 */
public abstract class AbstIBread implements IBread{
	private final IBread iBread;

	public AbstIBread(IBread iBread) {
		super();
		this.iBread = iBread;
	}
	
	//重写准备方法
	@Override
	public void prepare() {
		this.iBread.prepare();
	}
	
	//重写和面方法
	@Override
	public void kneadFlour() {
		this.iBread.kneadFlour();
	}
	
	//重写蒸馒头方法
	@Override
	public void steamed() {
		this.iBread.steamed();
	}
	
	//重写最后处理工作
	
	@Override
	public void process() {
		prepare();
		kneadFlour();
		steamed();
	}
}
package waking.test.zs;
/**
 * 甜馒头
 * @author waking
 *
 */
public class SweetDecorator extends AbstIBread{

	public SweetDecorator(IBread iBread) {
		super(iBread);
	}
	
	public void sweet() {
		System.out.println("加点糖、、、、");
	}
	
	//添加糖
	@Override
	public void kneadFlour() {
		this.sweet();
		super.kneadFlour();
	}
}
package waking.test.zs;
/**
 * 玉米馒头
 * @author waking
 *
 */
public class CornDecorator extends AbstIBread {

	public CornDecorator(IBread iBread) {
		super(iBread);
	}
	
	public void addCorn() {
		System.out.println("添加玉米、、、");
	}
	
	@Override
		public void kneadFlour() {
			this.addCorn();
			super.kneadFlour();
		}

}
package waking.test.zs;

import org.junit.Test;

/**
 * 测试类
 * @author waking
 *
 */

public class Tests {
	
	@Test
	public void Test1() {
		System.out.println("开始装饰馒头、、、");
		IBread iBread = new NormaIBread();
		//添加糖
		iBread = new SweetDecorator(iBread);
		//添加玉米面
		iBread = new CornDecorator(iBread);
		iBread.process();
		System.out.println("装饰完毕");
	}
}

开始装饰馒头、、、
开始准备工作、、、、
添加玉米、、、
加点糖、、、、
开始和面、、、、、
开始蒸馒头、、、、
装饰完毕
总结
waking-Java 发布了11 篇原创文章 · 获赞 10 · 访问量 195 私信 关注

标签:馒头,iBread,void,模式,public,简述,waking,装饰
来源: https://blog.csdn.net/weixin_43688349/article/details/104165621