• 【Java】【设计模式 Design Pattern】装饰器模式 Decorator


    解决的问题:

    对象的扩展问题:

    package cn.echo42.decorator;
    
    /**
     * @author DaiZhiZhou
     * @file Netty
     * @create 2020-07-29 16:49
     */
    public class Client {
    
        public static void main(String[] args) {
            Phone huaweiP30 = new Huawei();
            huaweiP30.function();
            System.out.println(huaweiP30.price());
    
            huaweiP30 = new MediaPlayerPhoneDecorator(huaweiP30);
            huaweiP30.function();
            System.out.println(huaweiP30.price());
    
            huaweiP30 = new ShotPhoneDecorator(huaweiP30);
            huaweiP30.function();
            System.out.println(huaweiP30.price());
    
            // 单件购买也可以
            Phone phone = new MediaPlayerPhoneDecorator();
            System.out.println(phone);
        }
    
        interface Phone {
            int price();
            void function();
        }
    
        static class Huawei implements Phone {
            @Override
            public int price() {
                return 1000;
            }
    
            @Override
            public void function() {
                System.out.println("华为手机的基础功能");
            }
        }
    
        interface PhoneDecorator extends Phone{
    
        }
    
        static class MediaPlayerPhoneDecorator implements PhoneDecorator {
    
            private Phone phone;
    
            public MediaPlayerPhoneDecorator() {
            }
    
            public MediaPlayerPhoneDecorator(Phone phone) {
                this.phone = phone;
            }
    
            public void setPhone(Phone phone) {
                this.phone = phone;
            }
    
            @Override
            public int price() {
                return 200 + this.phone.price();
            }
    
            @Override
            public void function() {
                phone.function();
                System.out.println("增强了MP3播放功能");
            }
        }
    
        static class ShotPhoneDecorator implements PhoneDecorator {
    
            private Phone phone;
    
            public ShotPhoneDecorator(Phone phone) {
                this.phone = phone;
            }
    
    
            public ShotPhoneDecorator() {
            }
    
            public void setPhone(Phone phone) {
                this.phone = phone;
            }
    
            @Override
            public int price() {
                return this.phone.price();
            }
    
            @Override
            public void function() {
                phone.function();
                System.out.println("增强了拍摄功能");
            }
        }
    }

    测试结果:

    华为手机的基础功能
    1000
    华为手机的基础功能
    增强了MP3播放功能
    1200
    华为手机的基础功能
    增强了MP3播放功能
    增强了拍摄功能
    1200
    cn.echo42.decorator.Client$MediaPlayerPhoneDecorator@677327b6
    
    Process finished with exit code 0
  • 相关阅读:
    基于三角形问题通过边界值分析和等价类划分进行黑盒测试
    小程序学习记录【数组操作相关(持续更新)】(1)
    Android实现九宫拼图过程记录
    高维数据Lasso思路
    CannyLab/tsne-cuda with cuda-10.0
    xgboost 多gpu支持 编译
    GDAL2.2.4 C#中的编译及使用
    SqlServer性能优化,查看CPU、内存占用大的会话及SQL语句
    WinForm任务栏最小化
    datatable与实体类之间相互转化的几种方法
  • 原文地址:https://www.cnblogs.com/mindzone/p/13398416.html
Copyright © 2020-2023  润新知