定义:
装饰者模式:在不改变原类文件以及不使用继承的情况下,动态地将责任附加到对象上,从而实现动态拓展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
设计原则:
要使用装饰者模式,需要满足以下设计原则:
1、多用组合,少用继承
2、开放-关闭原则:类应该对拓展开放,对修改关闭
类UML图:
一.抽象的被装饰者
package com.zqr.design.decoratorPattern;
/**
* 被装饰者
* @ClassName: Action
*/
public interface Action{
//吃
public void eating();
//睡
public void sleeping();
}
二.具体的被装饰者
package com.zqr.design.decoratorPattern;
/**
* 具体的被装饰者:人
* @ClassName: Person
*/
public class Person implements Action{
@Override
public void eating() {
System.out.println("人吃.....");
}
@Override
public void sleeping() {
System.out.println("人睡.....");
}
}
package com.zqr.design.decoratorPattern;
/**
* 具体的被装饰者:动物
* @ClassName: Animal
*/
public class Animal implements Action{
@Override
public void eating() {
System.out.println("动物吃.....");
}
@Override
public void sleeping() {
System.out.println("动物睡.....");
}
}
三.抽象的装饰者
package com.zqr.design.decoratorPattern;
/**
* 抽象装饰者Decorator:实现或者继承抽象的被装饰者Action
* @ClassName: Decorator
*/
public abstract class Decorator implements Action{
private Action action;//私有抽象的被装饰者属性
/**
* 构造注入Action
*/
public Decorator(Action action) {
this.action = action;
}
@Override
public void eating() {
action.eating();
}
@Override
public void sleeping() {
action.sleeping();
}
}
四.具体的装饰者
package com.zqr.design.decoratorPattern;
/**
* 具体的装饰者GoodDecorator
* @ClassName: GoodDecorator
*/
public class GoodDecorator extends Decorator{
/**
* 构造为基类注入Action
*/
public GoodDecorator(Action action) {
super(action);
}
@Override
public void eating() {
super.eating();
System.out.println("哈!吃的很好.....good");
}
@Override
public void sleeping() {
super.sleeping();
System.out.println("哈!睡的很好.....good");
}
}
package com.zqr.design.decoratorPattern;
/**
* 具体的装饰者:BadDecorator
* @ClassName: BadDecorator
*/
public class BadDecorator extends Decorator{
public BadDecorator(Action action) {
super(action);
}
@Override
public void eating() {
super.eating();
System.out.println("呸!吃的不好.....Bad");
}
@Override
public void sleeping() {
super.sleeping();
System.out.println("呸!睡的不好.....Bad");
}
}
五.Test
package com.zqr.design.decoratorPattern;
public class Test {
public static void main(String[] args) {
//人活动
Person person = new Person();
GoodDecorator goodDecorator = new GoodDecorator(person);
goodDecorator.eating();
goodDecorator.sleeping();
BadDecorator badDecorator = new BadDecorator(person);
badDecorator.eating();
badDecorator.sleeping();
//动物活动
Animal animal = new Animal();
GoodDecorator goodDecorator2 = new GoodDecorator(animal);
goodDecorator2.eating();
goodDecorator2.sleeping();
BadDecorator badDecorator2 = new BadDecorator(animal);
badDecorator2.eating();
badDecorator2.sleeping();
}
}