(九)JAVA设计模式23种设计模式之装饰者模式实例demo

装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。

 demo


入口类

package decorator_method_mod;

import org.junit.Test;

/**
 * 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
 *
 * 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
 *
 * 我们可以通过继承和组合的方式来给一个对象添加行为,虽然使用继承能够很好拥有父类的行为,但是它存在几个缺陷:一、对象之间的关系复杂的话,系统变得复杂不利于维护。二、容易产生“类爆炸”现象。三、是静态的。在这里我们可以通过使用装饰者模式来解决这个问题。
 *
 * 装饰者模式,动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更加有弹性的替代方案。虽然装饰者模式能够动态将责任附加到对象上,但是他会产生许多的细小对象,增加了系统的复杂度。
 *
 */
public class Client {
    @Test
    public void test(){
        Tiger tiger = new Tiger();
        SuperTiger flyTiger = new FlyTiger(tiger);
        SuperTiger swimTiger = new SwimTiger(flyTiger);
        swimTiger.play();
        //tiger can run
        //tiger can fly
        //tiger can swim
    }
}

 具体类,原始类 老虎

package decorator_method_mod;

/**
 * ConcreteComponent: 具体构件
 */
public class Tiger implements Birds {
    @Override
    public void play() {
        System.out.println(String.format("tiger can run"));
    }
}

接口 

package decorator_method_mod;

/**
 * Component: 抽象构件
 */
public interface Birds {
    public void play();
}

抽象装饰类 超级老虎 

package decorator_method_mod;

/**
 * Decorator: 抽象装饰类
 */
public abstract class SuperTiger implements Birds {
    private Birds birds;
    public SuperTiger(Birds birds){
        this.birds = birds;
    }

    @Override
    public void play() {
        birds.play();
    }
}

超级老虎实现类 飞虎 

package decorator_method_mod;

/**
 * ConcreteDecorator: 具体装饰类
 */
public class FlyTiger extends SuperTiger {
    public FlyTiger(Birds birds) {
        super(birds);
    }

    @Override
    public void play() {
        super.play();
        fly();
    }

    public void fly(){
        System.out.println(String.format("tiger can fly"));
    }
}

超级老虎实现类 游泳虎 

package decorator_method_mod;

/**
 * ConcreteDecorator: 具体装饰类
 */
public class SwimTiger extends SuperTiger {
    public SwimTiger(Birds birds) {
        super(birds);
    }

    @Override
    public void play() {
        super.play();
        swim();
    }

    public  void  swim(){
        System.out.println(String.format("tiger can swim"));
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值