吸蜜 發表於 2021-6-27 17:49:00

设计模式-装饰器模式

<h3 id="装饰器模式">装饰器模式</h3>
<p>定义:不改变原类文件和继承关系的情况下,动态扩展一个对象的功能。他是通过创建一个包装对象。</p>
<p>使用场景:不想使用继承,但又要在原有基础上增加额外功能。如一部手机,给他增加一个手机壳,再增加一个保护膜。</p>
<p>结构:</p>
<ul>
<li>抽象构件(Component):定义一个抽象接口</li>
<li>具体构件(ConcreteComponent):实现抽象构件</li>
<li>抽象装饰(Decorator):继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能</li>
<li>具体装饰(ConcreteDecorator):实现抽象装饰的相关方法,并给具体构件对象添加附加功能</li>
</ul>
<p><img src="https://img2020.cnblogs.com/blog/1178991/202106/1178991-20210627174330905-99092440.png" alt="" loading="lazy"></p>
<p>给一个只有打电话功能的手机增加功能。</p>
<p>代码示例:</p>
<pre><code>public interface IPhone {
    void call();
}
</code></pre>
<pre><code>public class Xiaomi implements IPhone {
    @Override
    public void call() {
      System.out.println("我有打电话的功能");
    }
}
</code></pre>
<pre><code>public class DecoratorPhone implements IPhone{

    private IPhone iPhone;

    public DecoratorPhone(IPhone iPhone) {
      this.iPhone = iPhone;
    }

    @Override
    public void call(){
      iPhone.call();
    }
}


</code></pre>
<pre><code>public class MusicPhone extends DecoratorPhone {

    public MusicPhone(IPhone iPhone) {
      super(iPhone);
    }

    @Override
    public void call() {
      super.call();
      System.out.println("我有了播放音乐功能");
    }
}
</code></pre>
<pre><code>public class PlayGamePhone extends DecoratorPhone {

    public PlayGamePhone(IPhone iPhone) {
      super(iPhone);
    }

    @Override
    public void call() {
      super.call();
      System.out.println("我有了打游戏功能");
    }
}
</code></pre>
<p>测试代码:</p>
<pre><code> public static void main(String[] args) throws InterruptedException, CloneNotSupportedException {
      IPhone iPhone=new Xiaomi();
      IPhone musicPhone=new MusicPhone(iPhone);
      IPhone playPhone=new PlayGamePhone(musicPhone);
      playPhone.call();

    }
</code></pre>
<p>返回目录</p>


</div>
<div id="MySignature" role="contentinfo">
    书山有路勤为径,学海无涯苦作舟<br><br>
来源:https://www.cnblogs.com/javammc/p/14941468.html
頁: [1]
查看完整版本: 设计模式-装饰器模式