简介
通过对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案。
使用对象的关联关系代替继承关系,更加灵活,同事避免了类型体系的快速膨胀。
通过创建一个包装对象,在不改变原有类的情况下,动态的为一个对象增加新的功能。
角色和责任
抽象组件角色
一个抽象接口,是被装饰类和装饰类的父接口。
具体组件角色
抽象组件的实现类。
抽象装饰角色
包含一个组件的引用,并定义了与抽象组件一直的接口。
具体装饰角色
抽象装饰角色的实现类,负责具体的装饰。
UML
image.png代码实现
package com.yuan.dp.decorator;
/**
* 制作蛋糕的接口
*/
public interface MakeCake {
/**
* 制作蛋糕的方法
*/
void make();
}
/**
* 父类:蛋糕_抽象类
*/
abstract class 蛋糕 implements MakeCake {
/**
* 制作蛋糕的方法
*/
@Override
public void make(){
System.out.println("制作普通蛋糕");
}
}
/**
* 子类:巧克力蛋糕_普通类
*/
class 巧克力蛋糕 extends 蛋糕 {
/**
* 制作 巧克力 蛋糕
*/
@Override
public void make() {
System.out.println("制作 巧乐力 蛋糕");
}
}
/**
* 子类:草莓蛋糕_普通类
*/
class 草莓蛋糕 extends 蛋糕 {
/**
* 制作 草莓 蛋糕
*/
@Override
public void make() {
System.out.println("制作 草莓 蛋糕");
}
}
/**
* 子类:抹茶蛋糕_普通类
*/
class 抹茶蛋糕 extends 蛋糕 {
/**
* 制作 抹茶 蛋糕
*/
@Override
public void make() {
System.out.println("制作 抹茶 蛋糕");
}
}
/**
* 修饰类的父类
* 修饰类:蛋糕的修饰类_普通类【核心】
* 核心:是你还有你,一切拜托你!
*/
class 蛋糕的修饰类 implements MakeCake {
MakeCake makeCake;
public 蛋糕的修饰类(MakeCake makeCake) {
this.makeCake = makeCake;
}
@Override
public void make() {
makeCake.make();
//如果这个方法没有被覆盖的话会出现这话【是不可能出现的,正常情况下】
System.out.println("这个方法没有被增强");
}
}
/**
* 修饰类的子类
* 增强:蛋糕中藏个口红
*/
class 口红蛋糕 extends 蛋糕的修饰类{
public 口红蛋糕(MakeCake makeCake) {
super(makeCake);
make();
}
@Override
public void make() {
makeCake.make();
System.out.println("并且偷偷塞进去一支 口红 ");
}
}/**
* 修饰类的子类
* 增强:蛋糕中藏个钻戒
*/
class 钻戒蛋糕 extends 蛋糕的修饰类{
public 钻戒蛋糕(MakeCake makeCake) {
super(makeCake);
}
@Override
public void make() {
makeCake.make();
System.out.println("并且偷偷塞进去一枚 钻戒 ");
}
}
/**
* 修饰类的子类
* 增强:蛋糕中藏个卡片
*/
class 卡片蛋糕 extends 蛋糕的修饰类{
public 卡片蛋糕(MakeCake makeCake) {
super(makeCake);
make();
}
@Override
public void make() {
makeCake.make();
System.out.println("并且偷偷塞进去一支 卡片 ");
}
}
测试类
package com.yuan.dp.decorator;
public class DecoratorTest {
public static void main(String[] args) {
// 买一个巧克力蛋糕
蛋糕 cake = new 巧克力蛋糕();
cake.make();
System.out.println("------------------");
// 买一个巧克力钻戒蛋糕
钻戒蛋糕 exCake = new 钻戒蛋糕(cake);
exCake.make();
System.out.println("------------------");
// 制作 巧乐力 蛋糕
// ------------------
// 制作 巧乐力 蛋糕
// 并且偷偷塞进去一枚 钻戒
// ------------------
}
}
网友评论