欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-15 09:54:03
代码演示: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() {...

代码演示:

demo1:模拟扩音器,放大声音装饰器设计模式-代码演示demo

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();
    }

}

输出结果:
装饰器设计模式-代码演示demo

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

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

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()+"元");
    }
}

输出结果:
装饰器设计模式-代码演示demo
装饰器模式:通俗就是类与类之间的关系。

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

相关标签: 设计模式