装饰模式——初学JAVA设计模式

本文详细介绍了Java设计模式中的装饰模式,解释了其基本概念、角色,并通过变形金刚和喜羊羊与灰太狼的例子展示了装饰模式的使用,包括透明模式和半透明模式的区别。装饰模式的优点在于其灵活性,但可能导致大量小对象的产生,增加调试难度。适用于需要动态扩展对象职责的场景。
摘要由CSDN通过智能技术生成

一、基本概念

装饰模式是一种用于替代继承的技术,它通过一种无须定义子类的方式来给对象动态增加职责,使用对象之间的关联关系取代类之间的继承关系。

装饰模式(Decorator)定义:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活。

模式角色

  • Component(抽象构件类):定义了对象的接口,可以给这些对象动态增加职责(方法),是具体构建和抽象装饰类的共同父类,声明了具体构件中需要实现的方法。

  • ConcreteComponent(具体构件类):定义了具体的构建对象,实现了在抽象构建中声明的方法,装饰器可以给他增加额外的方法。

  • Decorator(抽象装饰类):是抽象构建类的子类,用于具体构件增加职责。

  • ConcreteDecorator(具体装饰类):是抽象装饰类的子类,负责增添加新的职责。

二、简单实例

实例一、变形金刚

类图

在这里插入图片描述

代码实现

  • 抽象构件类Transform(变形金刚)
package com.transform;

public interface Transform {
   
    public void move();  //移动方法
}

接口中定义move()方法,具体构件类必须实现此方法。

  • 具体构件类Car(汽车类)
package com.transform;
/**
 * @Description:具体构件类
 * 注意这里的Car设置为final类型
 * 意味着不能通过继承拓展其功能,但是可以通过关联关系来拓展功能
 */
public final class Car implements Transform {
   

    public Car() {
   
        System.out.println("变形金刚是一辆车!");
    }

    @Override
    public void move() {
   
        System.out.println("在陆地上移动");
    }
}
  • 抽象装饰类Changer(变化类)
package com.transform;

/**
 * @Description:具体装饰类Changer
 * 具体装饰类是装饰模式的核心
 * 实现了move方法,保证原有方法不会丢失,又可以添加新的功能
 */
public class Changer implements Transform{
   
    private Transform transform;
    //构造方法注入
    public Changer(Transform transform) {
   
        this.transform = transform;
    }
    @Override
    public void move() {
   
        transform.move();
    }
}
  • 具体装饰类Robot(机器人类)
package com.transform;
/**
 * @Description:具体装饰类
 */
public class Robot extends Changer {
   
    //用构造方法继承了父类定义的方法,还可以增加新的职能
    public Robot(Transform transform) {
   
        super(transform);
        System.out.println("变成机器人");
    }
    public void say(){
   
        System.out.println("你tm说话啊!");
    }
}
  • 具体装饰类Airplane(飞机类)
package com.transform;
/**
 * @Description:具体装饰类
 */
public class Robot extends Changer {
   
    //用构造方法继承了父类定义的方法,还可以增加新的职能
    public Robot(Transform transform) {
   
        super(transform);
        System.out.println("变成机器人");
    }
    public void say(){
   
        System.out.println("你tm说话啊!");
    }
}
  • 客户端Client
package com.transform;
/**
 * @Description:
 */
public class Client {
   
    public static void main(String[] args) {
   
        //创建carmaro对象
        Transform camaro;
        camaro = new Car
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值