设计模式-装饰器模式
<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]