Java(装饰器模式)

装饰器模式:

        装饰器模式就是将其拆分成单独的装饰器类,这些装饰器类组合起来达到应用者想要目的的一种手段。其本质就是动态组合。

        举个简单的例子,去手机专卖店买了一部小米手机,与售货员谈条件最后购买了小米手机的同时还附赠了小米耳机和小米充电器,在这里你主要需要的只是小米手机,而其他零件只起到装饰小米手机的作用。它们的关系如下图所示:

通过代码进行详细阐述:

XIAOMICompany.java 

//01通用父类:小米公司
public abstract class XIAOMICompany {
    //只需包含显示信息即可,因为不需要写方法体,所以采用抽象类定义抽象方法
    public abstract void showInfo();
}

XIAOMIPhone.java

//02小米手机(被装饰者类)
public class XIAOMIPhone extends XIAOMICompany{
    //继承小米公司,因为是小米公司的产品,
    //抽象类可以作为父类,但是子类会报错,原因是,能继承抽象方法。
    //解决方案:
    //1.将子类也定义成抽象类
    //2.重写抽象类中所有的抽象方法,如果不重写或者只重写部分抽象方法,那么代码还会报错
    //所以本例中我们重写父类显示信息的方法
    @Override
    public void showInfo() {
        System.out.print("我是一个小米手机");
    }
}

XIAOMIParts.java

//03装饰者父类(装饰对象的总体)
public abstract class XIAOMIParts extends XIAOMICompany{
    XIAOMICompany xiaomiCompany;
    //构造方法
    public XIAOMIParts(XIAOMICompany xiaomiCompany) {
        this.xiaomiCompany = xiaomiCompany;
    }
}

XIAOMICharger.java

//04小米充电器
public class XIAOMICharger extends XIAOMIParts{
    public XIAOMICharger(XIAOMICompany xiaomiCompany) {
        super(xiaomiCompany);
    }
    @Override
    public void showInfo() {
        xiaomiCompany.showInfo();
        System.out.print("添加了小米手机充电器");
    }
}

XIAOMIEEar.java

//05小米耳机
public class XIAOMIEEar extends XIAOMIParts{
    public XIAOMIEEar(XIAOMICompany xiaomiCompany) {
        super(xiaomiCompany);
    }
    @Override
    public void showInfo() {
        xiaomiCompany.showInfo();
        System.out.print("添加了小米耳机");
    }
}

Test.java

//06测试类
import ZSQ.zsq.XIAOMIPhone;

public class Test {
    public static void main(String[] args) {
        XIAOMIPhone xiaomiPhone = new XIAOMIPhone();
        xiaomiPhone.showInfo();
        System.out.println();
    }
}

//06测试类
import ZSQ.zsq.XIAOMICharger;
import ZSQ.zsq.XIAOMIEEar;
import ZSQ.zsq.XIAOMIPhone;

public class Test {
    public static void main(String[] args) {
        XIAOMIPhone xiaomiPhone = new XIAOMIPhone();
        xiaomiPhone.showInfo();
        System.out.println();
//对象传递的是小米手机,所以结果是在小米手机上添加了小米充电器
        XIAOMICharger xiaomiCharger = new XIAOMICharger(xiaomiPhone);
        xiaomiCharger.showInfo();
        System.out.println();
//对象传递的是小米手机,所以结果是在小米手机上添加了小米耳机
        XIAOMIEEar xiaomieEar = new XIAOMIEEar(xiaomiPhone);
        xiaomieEar.showInfo();
        System.out.println();
    }
}

//06测试类
import ZSQ.zsq.XIAOMICharger;
import ZSQ.zsq.XIAOMIEEar;
import ZSQ.zsq.XIAOMIPhone;

public class Test {
    public static void main(String[] args) {
        XIAOMIPhone xiaomiPhone = new XIAOMIPhone();
        xiaomiPhone.showInfo();
        System.out.println();
//此时是在小米手机上添加了小米充电器
        XIAOMICharger xiaomiCharger = new XIAOMICharger(xiaomiPhone);
        xiaomiCharger.showInfo();
        System.out.println();
//此时传递的对象是已经添加了小米充电器的小米手机,
//所以结果会是在已经添加了小米充电器的手机的基础上再添加小米耳机
        XIAOMIEEar xiaomieEar = new XIAOMIEEar(xiaomiCharger);
        xiaomieEar.showInfo();
        System.out.println();
    }
}

你看懂了吗?

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
装饰器模式是一种结构型设计模式,它允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。在装饰器模式中,这些封装对象称为装饰器。 在 Java 中,装饰器模式通常用于动态地修改对象的运行时行为,而不是在编译时就静态地修改代码。这种模式可以让你在不改变一个对象的前提下给其增加新的功能。 具体实现时,装饰器类和被装饰类通常都实现同一个接口或继承同一个父类,这样可以保证它们之间的互换性。 下面是一个简单的示例代码: ```java interface Component { void operation(); } class ConcreteComponent implements Component { public void operation() { System.out.println("ConcreteComponent.operation()"); } } class Decorator implements Component { private Component component; public Decorator(Component component) { this.component = component; } public void operation() { component.operation(); } } class ConcreteDecoratorA extends Decorator { public ConcreteDecoratorA(Component component) { super(component); } public void operation() { super.operation(); System.out.println("ConcreteDecoratorA.operation()"); } } class ConcreteDecoratorB extends Decorator { public ConcreteDecoratorB(Component component) { super(component); } public void operation() { super.operation(); System.out.println("ConcreteDecoratorB.operation()"); } } public class Main { public static void main(String[] args) { Component component = new ConcreteComponent(); component = new ConcreteDecoratorA(component); component = new ConcreteDecoratorB(component); component.operation(); } } ``` 输出结果为: ``` ConcreteComponent.operation() ConcreteDecoratorA.operation() ConcreteDecoratorB.operation() ``` 这个示例中,`Component` 接口定义了一个 `operation()` 方法,`ConcreteComponent` 类实现了这个接口并提供了具体的实现。`Decorator` 类也实现了 `Component` 接口,并在其构造函数中接收一个 `Component` 对象,它的 `operation()` 方法会调用被装饰对象的 `operation()` 方法。`ConcreteDecoratorA` 和 `ConcreteDecoratorB` 类都继承自 `Decorator` 类,并在其 `operation()` 方法中先调用父类的 `operation()` 方法,再添加自己的行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值