Decorator(装饰者)模式

1.Decorator模式解决什么问题?
2.实现Decorator模式
3.小结

#Decorator模式解决什么问题?
定义:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

java.io包也是基于此模式组织代码,学习Decorator代码能帮助理解IO包

#实现Decorator模式
为了练手,我们来模拟电脑外设接入电脑主机,也就是用外设来装饰电脑

首先定义一个Computer的抽象类

package com.mike.pattern.decorator.eg1;

/**
 * @author mike
 * @date 2020-11-24
 * @desc 定义被装饰者
 */
public abstract class Computer {
	public abstract void connectingDevices();
}

被装饰者具体实现及初始信息

package com.mike.pattern.decorator.eg1;

/**
 * @author mike
 * @date 2020-11-24
 * @desc 定义被装饰者具体实现
 */
public class Desktop extends Computer {
	public void connectingDevices() {
		System.out.println("当前未连接任何外接设备");
	}
}

装饰者

package com.mike.pattern.decorator.eg1;

/**
 * @author mike
 * @date 2020-11-24
 * @desc 定义装饰者
 */
public abstract class Decorator extends Computer {
	public Computer computer;
	public Decorator(Computer computer) {
		this.computer = computer;
	}

	public void connectingDevices() {
		computer.connectingDevices();
	}
}

鼠标装饰类

package com.mike.pattern.decorator.eg1;

/**
 * @author mike
 * @date 2020-11-23
 * @desc 定义鼠标装饰
 */
public class DecoratorMouse extends Decorator {
	public DecoratorMouse(Computer computer) {
		super(computer);
	}

	@Override
	public void connectingDevices() {
		super.connectingDevices();
		System.out.println("鼠标已经链接");
	}
}

键盘装饰类

package com.mike.pattern.decorator.eg1;

/**
 * @author mike
 * @date 2020-11-23
 * @desc 定义键盘装饰器
 */
public class DecoratorKeybord extends Decorator {
	public DecoratorKeybord(Computer computer) {
		super(computer);
	}

	@Override
	public void connectingDevices() {
		super.connectingDevices();
		System.out.println("键盘已经链接");
	}
}

测试类

package com.mike.pattern.decorator.eg1;

/**
 * @author mike
 * @date 2020-11-23
 * @desc 测试装饰
 */
public class Test {
	public static void main(String[] args) {
		Desktop desktop = new Desktop();
		Decorator decorator = new DecoratorKeybord(new DecoratorMouse(desktop));
		decorator.connectingDevices();
	}
}

输出

#小结
学习设计模式最好的办法是先打好基础,尤其是有关,抽象类,接口方面的知识,加上多使用IDE断点调试功能,分析代码调用链,别人的文章只能给你指路,设计模式属于只能意会没法言传的一类知识,自己多思考,多敲代码才能体会其思想。

参考文章:https://blog.csdn.net/jason0539/article/details/22713711

原文地址:https://www.cnblogs.com/gy1010/p/14026926.html