装饰器模式(Decorator Pattern) 也称为包装模式(Wrapper Pattern) 是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模式。装饰器模式的核心是功能扩展,使用装饰器模式可以透明且动态地扩展类的功能。
本章代码: 小麻雀icknn/设计模式练习 - Gitee.com
UML类图

抽象类是用来被子类继承的。
例子:
锤子抽象类
- package com.study.main;
-
- /**
- * 锤子抽象类
- */
- public abstract class Hammer {
- String name;
- String price;
- String decribe;
-
- public Hammer() {
- }
-
- abstract String getPrice();
- abstract String getDecribe();
- }
普通锤子实例类
- package com.study.main;
-
- /**
- *
- * 锤子实例
- */
- public class BaseHammer extends Hammer{
- String price;
- String describe;
- public BaseHammer(String price,String describe) {
- super();
- this.price = price;
- this.describe = describe;
- }
-
- @Override
- String getPrice() {
- return this.price;
- }
-
- @Override
- String getDecribe() {
- return this.describe;
- }
- }
锤子装饰类
- package com.study.main;
-
- /**
- * 锤子装饰类
- */
- public class HammerDecorator extends Hammer{
- Hammer hammer;
- public HammerDecorator(Hammer hammer) {
- super();
- this.hammer = hammer;
- }
-
- @Override
- String getPrice() {
- return this.hammer.getPrice();
- }
-
- @Override
- String getDecribe() {
- return this.hammer.getDecribe();
- }
- }
装饰1实现类
- package com.study.main;
-
- /**
- * 装饰1
- */
- public class IronHammer extends HammerDecorator{
- public IronHammer(Hammer hammer) {
- super(hammer);
- }
-
- @Override
- String getDecribe() {
- return super.getDecribe() + ",这是一个铁做的锤子";
- }
-
- @Override
- String getPrice() {
- return super.getPrice() + "+ 20元";
- }
- }
装饰2实现类
- package com.study.main;
-
- /**
- * 装饰2
- */
- public class StoneHammer extends HammerDecorator{
- public StoneHammer(Hammer hammer) {
- super(hammer);
- }
-
- @Override
- String getPrice() {
- return super.getPrice() + "+ 10元";
- }
-
- @Override
- String getDecribe() {
- return super.getDecribe() + ",这是一个由石头构成的";
- }
- }
测试&运行
- package com.study.main;
-
- public class DecoratorMain {
- public static void main(String[] args) {
- Hammer hammer = new BaseHammer("10", "锤子描述:");
- IronHammer ironHammer = new IronHammer(hammer);
- StoneHammer stoneHammer = new StoneHammer(hammer);
- System.out.println(ironHammer.getDecribe());
- System.out.println(ironHammer.getPrice());
- System.out.println(stoneHammer.getDecribe());
- System.out.println(stoneHammer.getPrice());
- }
- }

JAVA中

Mybatis中

一般来讲装饰模式常用的使用场景有以下几种
优点:
缺点: