文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【设计模式】通过在苹果官网购买iPhone配件了解装饰器模式

2024-11-30 09:51

关注

苹果无需发布新的型号(继承),我们简单地通过装饰(组合)就可以得到想要的最终产品。

模式定义

Attach additional responsibilities to an object dynamically keeping the same interface. Decorators provide a flexible alternative to subclassing for extending functionality.

为动态保持相同接口的对象附加额外的职责。装饰器为扩展功能提供了一种灵活的选择,而不是子类化。

可以看到,是十分符合我们的需求的,每一个装饰品如保护壳、无线充,就是一个个可以嵌套的装饰器。

https://refactoringguru.cn/design-patterns/decorator

模式实现

1.定义iPhone接口

主要定义了iPhone模板的说明接口方法getDesc,后续以这个方法为核心,展开嵌套。

package com.example.designpattern.decorator;


public interface Phone {
    
    String getDesc();
}

2.实现iPhone接口

简单试下getDesc的方法,目前是一个裸机的iPhone。

package com.example.designpattern.decorator.impl;

import com.example.designpattern.decorator.Phone;


public class Iphone implements Phone {
    @Override
    public String getDesc() {
        return "iPhone";
    }
}

3.定义iPhone装饰器抽象类

装饰器的超类,里边存放iPhone属性,围绕它进行嵌套。

package com.example.designpattern.decorator.impl.decorator;

import com.example.designpattern.decorator.Phone;


public abstract class IphoneDecorator implements Phone {
    
    protected Phone phone;

    
    IphoneDecorator(Phone phone) {
        this.phone = phone;
    }
}

4.1.实现iPhone装饰器之保护壳

嵌套一

package com.example.designpattern.decorator.impl.decorator;

import com.example.designpattern.decorator.Phone;


public class IphoneCaseDecorator extends IphoneDecorator {
    
    public IphoneCaseDecorator(Phone phone) {
        super(phone);
    }

    @Override
    public String getDesc() {
        return "带保护壳的" + phone.getDesc();
    }
}

4.2.实现iPhone装饰器之无线充

嵌套二

package com.example.designpattern.decorator.impl.decorator;

import com.example.designpattern.decorator.Phone;


public class IphoneChargerDecorator extends IphoneDecorator {
    
    public IphoneChargerDecorator(Phone phone) {
        super(phone);
    }

    @Override
    public String getDesc() {
        return "带无线充的" + phone.getDesc();
    }
}

5.测试

这里我们先初始化一个iPhone,接着带上保护壳看看效果,最后再带上无线充看看效果。

package com.example.designpattern.decorator;

import com.example.designpattern.decorator.impl.Iphone;
import com.example.designpattern.decorator.impl.decorator.IphoneCaseDecorator;
import com.example.designpattern.decorator.impl.decorator.IphoneChargerDecorator;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class DesignPatternTest {
    @Test
    public void test() {
        // 常规iPhone
        Phone iphone = new Iphone();
        System.out.println(iphone.getDesc());

        // 带保护壳的iPhone
        iphone = new IphoneCaseDecorator(iphone);
        System.out.println(iphone.getDesc());

        // 带无线充的带保护壳的iPhone
        iphone = new IphoneChargerDecorator(iphone);
        System.out.println(iphone.getDesc());
    }
}

可以看到,随着装饰器的层层嵌套,iPhone的模样越来越复杂,是符合我们的预期的。

最后

装饰器主要是通过组合的模式,对类内容进行扩展,而不是通过继承的方式,特别是在Java只能单继承的情况,行之有效。

后面有空接着闲聊23种设计模式中的其他种。

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯