首页 > 编程知识 正文

Java实现装饰者模式,java io流两种设计模式

时间:2023-05-05 15:18:56 阅读:135281 作者:3610

概述:

本章可引称为“给予热爱继承的人新的设计视野”。 我们计划再次讨论典型的滥用问题。 在本章中,您将学习如何使用对象组合在运行时装饰类。 为什么呢? 一旦熟悉了装饰者的技术,就可以在不修改基本代码的情况下对你的(或其他人的)对象赋予新的责任。 —— 《Head First 设计模式》

使用环境:

我们有各种类型的东西,每个东西下面都有很多小的精细分类。 如果可以自由组合这些分类,比如一种饮料有一个主原料和几个配料,一个菜里一个主原料加几个配料,装饰一个房间等,考虑一下能否通过装饰模式来实现。 《Head First 设计模式》例星简单介绍优美的信封咖啡。

功能优势:

通过组合维护代码,可以通过动态组合对象,在不修改现有代码的情况下编写新代码来添加新功能。

思想分析:

在星星美丽的信封咖啡店里,有多种咖啡和多种调味料。 在一个咖啡里再放一个或几个配料的时候,主要是一个被装饰者和多个装饰者。 那么,这些咖啡和配料怎么收费呢(这里采用收费就是一个很好的例子。 当然,其他同样的事件也可以)。 如果说可以封装每个选项组合,那么有多少个类呢? 另一个是,如果咖啡店里咖啡或配菜的价格变动,或者需要追加新的咖啡或配菜时,该怎么办呢?

其实,本文的模式有很好的解决方案。 继承不再使用继承,因为类可能会爆炸。 让我们考虑一下,是否可以把咖啡店里的所有原料(包括主原料和所有原料)都当成一个东西(原料)。 这样,我们就可以在互相组合的过程中动态地实现一些功能。 你可能会问,为什么要把它当成一个东西,目的是让所有原料实现同样的功能,不管代码中的组合顺序如何。

类图展示:

当然,上面咖啡的四个班可以再封一级。 这里就书的内容进行了原样的输出。

代码显示:

Beverage.java

公共类beverage {

publicstringmdescription=' unknown beverage ';

私有int size=0;

公共字符串获取描述(

return mDescription;

}

公共获取(

返回大小;

}

公共void setsize (intsize ) {

this.size=size;

}

公共适配器双成本(;

}

CondimentDecorator.java

publicabstractclasscondimentdecoratorextendsbeverage {

@Override

公共双成本(

返回0;

}

publicabstractstringgetdescription (;

}

DarkRoast.java

publicclassdarkroastextendsbeverage {

private double mCost=0.99;

公共日期(例如

mDescription='Dark Roast Coffee ';

}

@Override

公共双成本(

返回成本;

}

}

Milk.java

publicclassmilkextendscondimentdecorator {

私有beverage mbeverage=null;

private double mCost=0.10;

公共密钥(beverage beverage ) {

mBeverage=beverage;

}

@Override

公共字符串获取描述(

return mBeverage.getDescription ',Milk ';

}

公共双成本(

return mCost mBeverage.cost (;

}

}

StarbuzzCoffee.java

公共类星巴克starbuzzcoffee {

publicstaticvoidmain (string [ ] args ) {

Beverage beverage=new Espresso (;

system.out.println (beverage.get description (' $ ' beverage.cost ) );

Beverage beverage2=new DarkRoast (;

beverage2=newMocha(beverage2;

beverage2=newMocha(beverage2;

beverage2=newwhip(beverage2;

system.out.println (beverage2. get description (' $ ' beverage2. cost ) );

beverage beverage3=new house blend (;

beverage3=newSoy(beverage3;

beverage3=newMocha(beverage3;

beverage3=newwhip(beverage3;

system.out.println (beverage3. get description (' $ ' beverage3. cost ) );

}

}

执行图例:

下载源代码:

3358 download.csdn.net/detail/u 013761665/8721015

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。