设计模式-装饰器模式

设计模式-装饰器模式

装饰器模式(Decorator Pattern)是一种设计模式,它允许在运行时为对象动态地添加新的行为和责任。这种模式是在不改变现有类结构的情况下,通过创建一个包装对象(即装饰器)来包裹真实对象,并向此装饰器添加额外的功能。

装饰器模式的关键在于能够通过组合而非继承的方式扩展对象的功能,从而提供更大的灵活性。

抽象提取理论:

  1. 封装变化
  2. 组合而非继承
  3. 透明代理
  4. 开闭原则

代码需求:为游戏角色更换服装,例如第一套服装是大T恤,垮裤,球鞋。第二套服装是西装,领带,皮鞋。你会如何设计呢?

装饰器实现

代码结构图

  • 抽象组件:人物形象
  • 具体组件:人
  • 抽象装饰:服饰
  • 具体装饰:大T恤,垮裤,球鞋; 西装,领带,皮鞋

代码实现:

java 复制代码
/**
 * 人物形象接口
 */
public interface ICharacter {
    /**
     * 基础方法
     */
    void show();
}
java 复制代码
/**
 * 人
 */
public class Person implements ICharacter{
    /** 名称 */
    private String name;

    /**
     * 姓名赋值
     */
    public Person(String name){
        this.name = name;
    }

    @Override
    public void show() {
        System.out.print("我是" + name + "我的服装是: ");
    }
}
java 复制代码
/**
 * 装饰器
 */
public class Finery implements ICharacter{
    /** 具体装饰 */
    protected ICharacter iCharacter;

    /**
     * 具体装饰赋值
     */
    public void setComponent(ICharacter iCharacter) {
        this.iCharacter = iCharacter;
    }

    @Override
    public void show() {
        if (iCharacter != null){
            // 调用具体装饰方法
            this.iCharacter.show();
        }
    }

}
java 复制代码
/**
 * 具体服饰-大T恤
 */
public class TShirts extends Finery{

    @Override
    public void show(){
        super.show();
        System.out.print(" 大T恤");
    }
}
java 复制代码
/**
 * 具体服饰-垮裤
 */
public class Sneakers extends Finery{
    @Override
    public void show()
    {
        super.show();
        System.out.print(" 垮裤");
    }
}
java 复制代码
/**
 * 具体服饰-西装
 */
public class Suit extends Finery{
    @Override
    public void show(){
        super.show();
        System.out.print(" 西装");
    }
}
java 复制代码
/**
 * 具体服饰-领带
 */
public class Tie extends Finery{
    @Override
    public void show(){
        super.show();
        System.out.print(" 领带");
    }

}
java 复制代码
/**
 * 客户端
 */
public class DecoratorDemo {
    public static void main(String[] args) {
        // 定义人信息
        Person person = new Person("小明");

        // 第一套服装 先穿衣服,穿裤子
        TShirts tShirts = new TShirts();
        tShirts.setComponent(person);
        Sneakers sneakers = new Sneakers();
        sneakers.setComponent(tShirts);
        sneakers.show();
        System.out.println();


        // 第二套服装 先穿西装,再上领带
        Suit suit = new Suit();
        suit.setComponent(person);
        Tie tie = new Tie();
        tie.setComponent(suit);
        tie.show();
        System.out.println();
    }
}

输出结果:

复制代码
Connected to the target VM, address: '127.0.0.1:20955', transport: 'socket'
我是小明我的服装是:  大T恤 垮裤
我是小明我的服装是:  西装 领带
Disconnected from the target VM, address: '127.0.0.1:20955', transport: 'socket'

Process finished with exit code 0
相关推荐
zzu123zsw11 小时前
业务拆分后的治理深水区:解构企业级微服务六大核心设计模式与高可用落真实践
微服务·设计模式·架构·高可用·微服务架构设计
牧瀬クリスだ11 小时前
观察者模式:一个对象变化,一群对象自动响应
java·观察者模式·设计模式
拆房老料14 小时前
【第四部分:Agentic 智能体设计模式】16. 一个 Prompt 搞不定复杂任务?试试 Prompt Chaining
java·前端·人工智能·设计模式·prompt
MobotStone1 天前
AI 写代码越来越爽,但程序员可能越来越废了
人工智能·设计模式
墨子夕1 天前
设计模式——Java × Python 双语言精讲 · 23 个经典模式 + 现代演进(前言篇)
java·开发语言·设计模式
墨子夕1 天前
设计模式——Java × Python 双语言精讲 · 23 个经典模式 + 现代演进(第一篇)
java·python·设计模式
General_G1 天前
创建型模式—原型(Prototype)模式
c++·设计模式·原型模式
geovindu1 天前
rust: Template Method Pattern
开发语言·后端·设计模式·rust·行为模式·模板方法模
geovindu1 天前
rust: Template Method Pattern(续)
开发语言·后端·设计模式·rust·行为模式·板方法模式
博风1 天前
17、设计模式应用举例:单件模式:多线程争冠军
设计模式