当前位置: 移动技术网 > IT编程>软件设计>设计模式 > 装饰器设计模式-代码演示demo

装饰器设计模式-代码演示demo

2020年07月31日  | 移动技术网IT编程  | 我要评论

代码演示:

demo1:模拟扩音器,放大声音工程结构

model实体:

package com.charis.io.model;

/**
 *  声音 实体类
 * @author Charis
 */
public class Voice {

    // 声音大小
    private Integer size;

    public Voice(Integer size) {
        this.size = size;
    }

    public Integer getSize() {
        return size;
    }

    public void setSize(Integer size) {
        this.size = size;
    }

}

dao接口:

package com.charis.io.dao;


/**
 * @author Charis
 */
public interface ExplainDao {

    //  声音分呗的说明
    void say();

}

service业务层逻辑:

package com.charis.io.service;

import com.charis.io.dao.ExplainDao;
import com.charis.io.model.Voice;

/**
 *   人的原声 业务
 * @author Charis
 */
public class PersonService implements ExplainDao {
    // 创建声音对象
    Voice voice = new Voice(10);

    @Override
    public void say() {
         System.out.println("人的原声为:"+ voice.getSize() + "分呗");
    }

}

package com.charis.io.service;

import com.charis.io.dao.ExplainDao;

/**
 *  声音 放大器业务
 * @author Charis
 */
public class AmplifierService implements ExplainDao {
    // 创建人物对象
    private PersonService personService;

    public AmplifierService(PersonService personService) {
        this.personService = personService;
    }

    // 对人的原声音进行放大
    @Override
    public void say() {
        System.out.println("人的声音放大为:" + personService.voice.getSize()*10 +"分呗");
    }
}

controller控制器:

package com.charis.io.controller;

import com.charis.io.service.AmplifierService;
import com.charis.io.service.PersonService;

/**
 *  装饰器设计模式
 *      功能:模拟扩音器,放大声音
 * @author Charis
 */
public class DecoratorTest1 {

    public static void main(String[] args) {
        // 1、人原声测试
        PersonService personService = new PersonService();
        personService.say();
        System.out.println("--------------------------------------");
        // 2、人放大后的声音测试
        AmplifierService amplifierService = new AmplifierService(personService);
        amplifierService.say();
    }

}

输出结果:
在这里插入图片描述

demo2:模拟不同口味的咖啡价格

在这里插入图片描述

model实体类:

package com.charis.io2.model;

/**
 *  饮料 实体类
 * @author Charis
 */
public class Drink {

    // 费用
    private Double cost;

    // 名字
    private String name;

    public Drink(String name) {
        this.name = name;
    }

    public Drink(Double cost) {
        this.cost = cost;
    }

    public Double getCost() {
        return cost;
    }

    public void setCost(Double cost) {
        this.cost = cost;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

dao接口:

package com.charis.io2.dao;

/**
 * 抽象组件
 *
 * @author Charis
 */
public interface DrinkDao {

    // 费用信息
    public abstract double money();

    // 说明信息
    public abstract String state();
}

DAO接口impl实现类:

定义饮料对象:

package com.charis.io2.dao.impl;

import com.charis.io2.dao.DrinkDao;
import com.charis.io2.model.Drink;

/**
 * 具体组件
 * @author Charis
 */
public class CoffeeDao implements DrinkDao {

    // 创建饮料对象
    Drink drink = new Drink("原味咖啡");
    Drink drink2 = new Drink(10.0);

    // 费用信息
    @Override
    public double money() {
        return drink2.getCost();
    }

    // 说明信息
    @Override
    public String state() {
        return drink.getName();
    }

}


装饰类:

package com.charis.io2.dao.impl;

import com.charis.io2.dao.DrinkDao;

/**
 * 抽象装饰类
 * @author Charis
 */
public abstract class DecorateDao implements DrinkDao {
    //对象抽象组件的引用
    private CoffeeDao coffeeDao;

    public DecorateDao(CoffeeDao coffeeDao) {
        this.coffeeDao = coffeeDao;
    }

    // 费用信息
    @Override
    public double money() {
        return coffeeDao.money();
    }
    // 说明信息
    @Override
    public String state() {
        return coffeeDao.state();
    }
}

service业务层:
牛奶:

package com.charis.io2.service;

import com.charis.io2.dao.impl.CoffeeDao;
import com.charis.io2.dao.impl.DecorateDao;

/**
 * 具体装饰类
 * @author Charis
 */
public class MilkService extends DecorateDao {

    public MilkService(CoffeeDao coffeeDao) {
        super(coffeeDao);
    }

    // 费用信息
    @Override
    public double money() {
        return super.money()*4;
    }

    // 说明信息
    @Override
    public String state() {
        return super.state()+"加入了牛奶";
    }
}

蜂蜜:

package com.charis.io2.service;

import com.charis.io2.dao.impl.CoffeeDao;
import com.charis.io2.dao.impl.DecorateDao;

/**
 * 具体装饰类
 * @author Charis
 */
public class SugerService extends DecorateDao {

    public SugerService(CoffeeDao coffeeDao) {
        super(coffeeDao);
    }

    // 费用信息
    @Override
    public double money() {
        return super.money()*2;
    }

    // 说明信息
    @Override
    public String state() {
        return super.state()+"加入了蜂蜜";
    }

}

controller控制器:

package com.charis.io2.controller;

import com.charis.io2.dao.DrinkDao;
import com.charis.io2.dao.impl.CoffeeDao;
import com.charis.io2.service.MilkService;
import com.charis.io2.service.SugerService;

/**
 * 装饰器设计模式
 *      功能:模拟咖啡
 *  组件:
 *   1、抽象组件:需要装饰的抽象对象(接口或抽象父类)
 *   2、具体组件:需要装饰的对象
 *   3、抽象装饰类:包含了对抽象组件的引用以及装饰着共有的方法
 *   4、具体装饰类:被装饰的对象
 * @author Charis
 */
public class DecorateTest2 {
    public static void main(String[] args) {
        // 创建 咖啡对象
        CoffeeDao coffer = new CoffeeDao();

        // 1、加入蜂蜜 价格
        SugerService suger = new SugerService(coffer);
        System.out.println(suger.state()+"----"+suger.money()+"元");

        System.out.println("---------------------------");
        // 2、加入牛奶 价格
        DrinkDao milk = new MilkService(coffer);
        System.out.println(milk.state()+"----"+milk.money()+"元");
    }
}

输出结果:
在这里插入图片描述
装饰器模式:通俗就是类与类之间的关系。

本文地址:https://blog.csdn.net/qq_45042013/article/details/107701475

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网