设计模式 - 装饰器模式

本文介绍装饰者模式的基本概念,并通过具体的Java代码实现展示了如何利用该模式动态地给一个类添加职责。通过咖啡饮料的例子,解释了抽象组件、具体组件、装饰器及具体装饰器的角色及其工作原理。
Decator定义:动态的给一个类添加一些职责


package org.savior.decorator;

abstract class Beverage {
abstract String getDescription();
abstract double getCost();
}

class HouseBlend extends Beverage{

@Override
double getCost() {
return 10.00;
}

@Override
String getDescription() {
return "HouseBlend咖啡";
}

}

class Espresson extends Beverage{

@Override
double getCost() {
return 20.00;
}

@Override
String getDescription() {
return "Espresson咖啡";
}

}

class Decorator extends Beverage{
private Beverage beverage;

public Decorator(Beverage beverage){
this.beverage = beverage;
}

@Override
double getCost() {
return beverage.getCost();
}

@Override
String getDescription() {
return beverage.getDescription();
}

}

class Milk extends Decorator{
public Milk(Beverage beverage) {
super(beverage);
}

double getCost() {
double cost = super.getCost();
return cost + 2.0;
}

String getDescription() {
String des = super.getDescription();
return des + "加牛奶";
}

}

class Mocha extends Decorator{
public Mocha(Beverage beverage) {
super(beverage);
}

double getCost() {
double cost = super.getCost();
return cost + 5.0;
}

String getDescription() {
String des = super.getDescription();
return des + "加摩卡";
}

}


class Client{
public static void main(String[] args) {
Beverage b = new HouseBlend();
Decorator d = new Mocha(b);
System.out.println(d.getCost());
System.out.println(d.getDescription());
}
}


Beverage 是抽象组件,HouseBlend是具体组件
Decorator 是装饰器组件,Milk为具体装饰器


package org.savior.decorator;

import java.util.*;

public class Price {
public static void main(String[] args) {
Component c = new ConcreteComponent();

prizeDecorator p = new GroupPrizeDecorator(c);

System.out.println(p.calPrize("王五"));
}
}

/**
* 测试数据
*/
class TempDB{
public static Map<String,Double> map = new HashMap<String,Double>();

static{
map.put("张三", 1000.0);
map.put("李四", 2000.0);
map.put("王五", 3000.0);
}
}

/**
* 计算奖金的组件接口
*/
abstract class Component{
/**
* 奖金计算方法
* @param user
* @return
*/
public abstract double calPrize(String user);
}

class ConcreteComponent extends Component{

public double calPrize(String user) {
return 0;
}
}


abstract class prizeDecorator extends Component{
/*
* 被装饰的组件对象
*/
private Component component;

public prizeDecorator(Component component){
this.component = component;
}

public double calPrize(String user){
/*
* 转掉组件的对象方法
*/
return component.calPrize(user);
}
}

class GroupPrizeDecorator extends prizeDecorator{

public GroupPrizeDecorator(Component component) {
super(component);
}

public double calPrize(String user){
double money = super.calPrize(user);

double group = 0.0;

for(double d : TempDB.map.values()){
group += d;
}

return money + group;
}
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值