zoukankan      html  css  js  c++  java
  • 【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
  • 相关阅读:
    python编写弹球游戏的实现代码
    Linux kernal
    ccc
    Ubuntu14.04 支持 exFat 格式操作
    Ubuntu 14.04 tar 打包系统安装到新机器
    Ubuntu14.04 dd命令克隆系统镜像安装到另一台机器上
    gzip 的使用
    gzip: stdin: unexpected end of file tar: Unexpected EOF in archive
    c++ 实现等待5s
    Ubuntu14.04 系统复制迁移到新的机器上
  • 原文地址:https://www.cnblogs.com/mindzone/p/13398416.html
Copyright © 2011-2022 走看看