android 框架之基础装饰设计模式

Android源码设计模式探索与实战【装饰者模式】 理解: 装饰者是结构性设计模式的一种。我们一般用这个词,是指对于本身事物没有去改变他,而是给他加了一个外框装饰,是为了这个事物。在代码的世界中,就是对于某一对象的装饰。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。它是作为现有的类的一个包装。定义: 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。 Component:可 阅读详情

星巴克(Starbucks)是美国一家连锁咖啡公司的名称,1971年成立,是全球最大的咖啡连锁店,其总部坐落美国华盛顿州西雅图市,早期 的星巴克由于扩展速度过快,所以他们要更新订单系统,以合乎他们的饮料供应要求.他们原先的类设计是这样的:

Beverage(饮料)是一个抽象类,cost()是一个抽象的方法,我们看到下面4个子类都实现了cost()方法,cost()方法表示饮料的价钱,而getDescription()用来描述饮料,

客户在购买咖啡时,也可以要求在其中加入各种调料,例如:蒸奶,豆浆,摩卡,或者其他调料,星巴克会根据所加入的调料收取不同的费用,所以订单系统必须考虑到这些调料部分.那么客户最后结算是根据咖啡+调料最终的总价格,比如有15种调料,那么就必须写15个子类去继承Beverage(饮料),这不是导致类太多,而且不易扩展,这就是使用继承带来的不好维护地方,于是开发人员就要想办法打破这噩梦,他们在想首先要判断客户是否加了某种调料,我要判断如果加了我就把对应的调料的价格加入到总价上,那么这个功能就放在父类上去做,而各种咖啡的价值则是由各种子类自己去实现,

public  class Beverage {
	public String description;
	public boolean milk;
	public boolean soy;
	public boolean mocha;
	public boolean whip;
	public String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}
	public boolean isMilk() {
		return milk;
	}
	public void setMilk(boolean milk) {
		this.milk = milk;
	}
	public boolean isSoy() {
		return soy;
	}
	public void setSoy(boolean soy) {
		this.soy = soy;
	}
	public boolean isMocha() {
		return mocha;
	}
	public void setMocha(boolean mocha) {
		this.mocha = mocha;
	}
	public boolean isWhip() {
		return whip;
	}
	public void setWhip(boolean whip) {
		this.whip = whip;
	}
	/**
	 * 计算歌各种调料的价格
	 * @return
	 */
	public  int cost(){
		int flavour = 0;
		if(milk){
			flavour+=5;
		}
		if(soy){
			flavour+=2;
		}
        if(mocha){
        	flavour+=3;
		}
        if(whip){
        	flavour+=3;
		}
		return flavour;
	}
}
HouseBlend.java

public class HouseBlend extends Beverage {
	public int coffee;
	public void setCoffee(int coffee) {
		this.coffee = coffee;
	}
	@Override
	public int cost() {
		return coffee+super.cost();
	}
}
上层调用:

public class Clent {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		HouseBlend houseBlend = new HouseBlend();
		houseBlend.setDescription("不错的咖啡");
		houseBlend.setCoffee(15);
		houseBlend.setMilk(true);
		houseBlend.setSoy(true);
		System.out.println(houseBlend.getDescription()+"花了"+houseBlend.cost()+"美元");
	}
}
结果:


这种设计比第一种好在不必要创建那么多子类,而是用boolean值去代替了要加入那种调料,类图如下:


这样的设计优于第一种使用继承的方式,但是这个设计的缺点在于变化不可控,比如节日新增加了新的调料,我们就要在Beverage类上添加一个变量,然后Beverage类中的cost方法也要改变,对后期的维护很不方便,这种设计违背了6大设计原则中的类应该对扩展开放,对修改关闭.也就是说新需求在不修改现有的代码情况下,但是可以添加类什么的来完成后期的需求变化,所以开发人员必须在此设计基础上再次对系统进行改造。

新系统设计思路:

我们要以饮料为主体,然后运行时以调料来 "装饰(decorate)"饮料,比方说,如果顾客想要摩卡和奶泡培咖啡,那么,要做的是:

第一步:拿一个深培咖啡(DarkRoast)对象

第二步:以摩卡(Mocha)对象装饰它

第三步:以奶泡(whip)对象装饰它

第四步:调用cost()方法,并依赖委托(delegate)将调料的价钱加上去,

思路想好了,但是具体到某个开发人员怎么去利用代码实现出来呢?首先如何装饰一个对象,而委托又要如何与此搭配使用呢?架构师点了一下:把装饰者对象当成包装者,苦逼的码农开始在想,首先得创建几个类,

DarkRoast(深培咖啡)


Mocha(摩卡),所以建立一个Mocha对象,并用它将DarkRoast对象包装起来,因为最后计算总价格,是咖啡的钱+饮料的钱,所以在这里要持有DarkRoast的引用,好调用cost()方法,


如果顾客一天没吃饭了,晚上想多吃点,所以顾客还想点一个奶泡(whip),所以需要建立一个Whip装饰者,并用它将Mocha对象包起来,别忘了,DarkRoast继承自Beverage,并有一个cost()方法,用来计算饮料价钱,

当最后顾客结账的时候,通过调用最外层的Whip对象的cost()方法即可,Whip对象的cost()会先委托它装饰的对象(也就是Mocha)计算出价钱,然后再加上奶泡的价钱,

你会发现这些创建的类中都有一个公共的方法cost(),是的因为他们都继承自Beverage这个类,

通过上面的你会发现装饰者和被装饰者有如下几个关系:

1:装饰者和被装饰对象有相同的父类(Beverage)
2:可以用一个或多个装饰者包装一个对象,

3:既然装饰者和被装饰对象有相同的父类,所以在任何需要原始对象(被包装Beverage)的场合,可以用装饰过的对象代替它,

4:装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以达到特定的目的.

5:对象可以在任何时候被装饰,所以可以在运行时动态地,不限量地用你喜欢的装饰者来装饰对象.

写到这里看下装饰模式的概念:

动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的代替方案.

它的类图如下:



他们的角色如下:

1.Component(被装饰对象的基类)定义一个对象接口,可以给这些对象动态地添加职责。

2.ConcreteComponent(具体被装饰对象)定义一个对象,可以给这个对象添加一些职责。

3.Decorator(装饰者抽象类)维持一个指向Component实例的引用,并定义一个与Component接口一致的接口。

4.ConcreteDecorator(具体装饰者)具体的装饰对象,给内部持有的具体被装饰对象,增加具体的职责

现在用这个模式来解决星巴克订单系统,设计类图如下:


为了验证系统是否具有扩展和维护,我们随便来个需求,客户点了一个"双倍摩卡豆浆奶泡拿铁咖啡":

代码如下:

Beverage.java

package com.decorate;
public abstract class Beverage {
	String description = "";
	public String getDescription() {
		return description;
	}
	public abstract double cost();
}
CondimentDecorator.java
package com.decorate;
/**
 * 调料被装饰抽象类
 */
public abstract class CondimentDecorator extends Beverage {
	public abstract String getDescription();
}
DrakRoast.java
package com.decorate;
import com.decorate.Beverage;
public class DrakRoast extends Beverage {
	public DrakRoast(){
		description = "DrakRoast";
	}
	@Override
	public double cost() {
		return 1.05;
	}
}
Espresso.java
package com.decorate;
public class Espresso extends Beverage{
	@Override
	public double cost() {
		return 1.99;
	}
	public Espresso(){
		description = "Espresso";
	}
}
HouseBlend.java
package com.decorate;
public class HouseBlend extends Beverage{
	public HouseBlend(){
		description = "HouseBlend";
	}
	@Override
	public double cost() {
		return 0.89;
	}
}
Mocha.java
package com.decorate;
public class Mocha extends CondimentDecorator{
	Beverage beverage;
	public Mocha(Beverage beverage){
		this.beverage = beverage;
	}
	@Override
	public String getDescription() {
		return beverage.getDescription()+",Mocha";
	}
	@Override
	public double cost() {
		return beverage.cost()+.20;
	}
}
Whip.java
package com.decorate;
public class Whip extends CondimentDecorator {
	Beverage beverage;
	public Whip(Beverage beverage){
		this.beverage = beverage;
	}
	@Override
	public String getDescription() {
		return beverage.getDescription()+",Whip";
	}
	@Override
	public double cost() {
		return beverage.cost()+.20;
	}
}
测试类:
package com.decorate;
/**
 * 测试类
 * @author admin
 */
public class Test {
	public static void main(String[] args) {
			 Beverage beverage = new Espresso();
			 System.out.println(beverage.getDescription()+":$"+beverage.cost());
			 Beverage beverage2 = new DrakRoast();
			 beverage2 = new Mocha(beverage2);
			 beverage2 = new Mocha(beverage2);
			 beverage2 = new Whip(beverage2);
			 System.out.println(beverage2.getDescription()+":$"+beverage2.cost());
	}
}
运行结果:

Espresso:$1.99
DrakRoast,Mocha,Mocha,Whip:$1.65

装饰模式就讲到这里了!
设计模式就是在特定的场景下解决什么问题而已,就是个套路!








告别理论!手把手教你用Patran/Nastran搞定悬臂翼的颤振分析(附完整模型文件) 本文提供了一份详细的Patran/Nastran悬臂翼颤振分析实战指南,涵盖从几何建模到结果解读的全过程。通过手把手教学和完整模型文件,帮助工程师和学生快速掌握气动弹性分析技术,特别适合需要实际操作的初学者。文章重点介绍了模态分析、气动建模和颤振求解等关键步骤,并提供了常见问题排查和优化建议。 阅读详情

相关推荐

MIT6.824-lab2D-2022(日志压缩详细讲解)

从paper中去讲解,并实现关于lab2D的代码。

幸平的博客 6035

Android设计模式--装饰模式

千淘万漉虽辛苦,吹尽黄沙始到金

袁震的博客 1747

Win10 + Linux 双系统删除(Linux)

删除Linux所使用的磁盘分区 进入此电脑->计算机->管理->磁盘管理

weixin_52247624的博客 943

Android的设计模式-装饰者模式

前言Android的设计模式系列文章介绍,欢迎关注,持续更新中: Android的设计模式-设计模式的六大原则 创建型模式: Android的设计模式-单例模式 Android的设计模式-建造者模式 Android的设计模式-工厂方法模式 Android的设计模式-简单工厂模式 Android的设计模式-抽象工厂模式 Android的设计模式-原型模式

四月葡萄的博客 905

了解随机振动疲劳分析中 Ansys nCode DesignLife 的平均应力校正

通过选择静态环境,我们可以将其结果视为疲劳计算的平均应力,如图 3 所示,因此从静态偏移载荷工况中提取的平均应力用于转移预测雨流计数中所有循环的平均值。您可以通过观看下面的教学视频获得宝贵的见解,该视频将指导您完成利用 Ansys nCode DesignLife 分析平均应力对随机振动载荷下结构的影响的过程。它基于 R 比率或平均应力水平。另一方面,平均应力校正可以帮助消除平均应力的负面影响,提高结果的保真度。Ansys nCode 提供先进的平均应力校正技术,使工程师能够考虑平均应力对疲劳寿命的影响。

jkh920184196的博客 1518

ali140滑块

ali 140滑块采用补环境的方式进行逆向,需要的文件主要为这两个,其中collina.js是最主要的环境校验和参数加密的逻辑,这两个文件放本地进行补环境。然后挂上代理,先保证能够正常运行代码,补了些许后能够正常运行了,我们打印最主要的加密函数看看:n值就是得到:挂上代理看看鼠标事件,不管加密逻辑,关心入参即可:收集一些鼠标事件传进记录的函数。其余就是处理一些环境值,一些resetSA的逻辑就行。截图记录:

bboysteed的博客 1677

android设计模式之装饰模式

装饰模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),结构型设计模式之一,其使用一种对客户端透明的方式来动态扩展对象的功能,同时它也是继承关系的一种替代方案之一。(组合方案也是继承关系的一种替代方案)。   装饰模式的定义 动态给一个对象添加一些额外的职责。就增加功能来说,装饰模式生成子类更加灵活。   装饰模式的使用场景 需要透明且动态地扩展...

且听真言 959

kaggle社区LLM Classification Finetuning

预测用户在一个由大型语言模型(LLMs)驱动的聊天机器人之间的正面交锋中会偏好哪些回应。获得来自聊天机器人竞技场(Chatbot Arena)的对话数据集,其中不同的LLMs对用户的提示生成答案。通过开发一个胜出的机器学习模型,帮助改进聊天机器人与人类的互动方式,并确保它们更好地符合人类的偏好。实际上是进行一个序列的分类。

m0_73542617的博客 1916

Android设计模式之装饰器模式

截止目前为止,我已经学了四个设计模式了,首先回顾一下这几天学习设计模式的感悟,第一个接触的当然就是单例模式了,单例模式由于将构造方法私有化,因此在类的外面不能创造该类的对象,那么问题来了,那我们就在类的里面得到该类的对象,且该类的对象而且是唯一的,就是这样。接着学习了责任链模式,责任链模式不用多说,就是一条链式结构,该模式的核心思想就是将职责沿着一条链式结构进行传递。接着就是原型模式,原型模式感觉

u014675538的博客 1030

华为od 面试八股文_测试/测试开发_01_含答案

华为od面试八股文_测试/测试开发_01_含答案

MISAYAONE的博客 3815

用urdf给自己的ROS小车编写模型

3.3 使用urdf编写自己的ROS小车模型 3.3.1 常见的ROS小车结构有哪些? 下面就是常见的ROS小车,相信在大家的脑海里已经有了自己小车的样子,下面我和大家一起使用urdf对ros小车建模。 这里只对urdf进行简单介绍,然后就带大家使用urdf最基础的标签,建立机器人的urdf机器人模型。关于更多细节,请参看官网:http://wiki.ros.org/urdf/Tutorials 3.3.2 什么是urdf?建模的原因? 什么是urdf? URDF(Unified Robot Descri

「小白学移动机器人」一个专注分享移动机器人相关知识的公众号! 1万+

Android设计模式详解之装饰模式

装饰模式也称为包装模式,结构型设计模式之一;动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式生成子类更为灵活;需要透明且动态地扩展类的功能时;UML类图:抽象组件,可以是一个接口或抽象类,充当的就是被装饰的原始对象;组件具体实现类了;该类是Component类的基本实现,也是我们装饰的具体对象;抽象装饰者,为了装饰我们的组件对象,内部持有一个指向组件对象的引用,该类为抽象类,需要根据不同的装饰逻辑实现不同的具体子类;装饰者具体实现类,对抽象装饰者的具体实现;

故不积跬步无以至千里 1259

Python爬虫实战:实时爬取东方财富网股票行情

东方财富网实时行情(价格、涨跌幅、成交量等)K线图、分时图、技术指标市盈率、换手率、总市值等指标相比某些收费API,东方财富网页端接口不需要登录、免费、响应快、封装清晰,适合爬虫实践。东方财富网股票数据接口分析实时数据抓取与字段提取数据结构化处理自动化批量抓取多线程加速采集数据可视化展示支持存储为CSV/Excel/数据库。

2201_76125261的博客 1万+

二十、装饰设计模式

1. 装饰设计模式介绍定义动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。2. 装饰设计模式使用场景动态地给一个对象添加一些额外的职责。3. 装饰设计模式UML类图角色介绍: Component:抽象组件,充当的是被装饰的原始对象。 ConcreteComponent:组件具体实现类。 Decotor:抽象装饰类:职责就是为了装饰组件对象,内部有一个指向组件对象的引

sp不会玩ps 1647

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

设计模式之《装饰器模式》

装饰器模式是一种结构型设计模式,它允许动态地将责任附加到对象上,以便根据需要扩展对象功能。装饰器模式通过增加或修改现有类的功能,使得在不改变原有类的情况下,可以动态地扩展其功能特性。这种模式是一种包装模式,即利用对象组合为原始对象提供功能增强的方式。装饰器模式是一种灵活、动态的扩展对象功能的设计模式。在Android中,装饰器模式被广泛应用在View的Drawable中,从而实现各种控件的外观、动态效果等功能特性的扩展。

小孟来码的博客 1720

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Android之装饰者设计模式

装饰着设计模式

i_nclude的博客 267

Android 装饰者模式【设计模式】

装饰者模式 1.装饰者模式,动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更加有弹性的替代方案。 2.关系图(模拟场景:给咖啡添加不同的配料,显示不同的价格) 3.装饰者模式的优缺点 优点 1、装饰者模式可以提供比继承更多的灵活性。 2、可以通过一种动态的方式来扩展一个对象的功能,在运行时选择不同的装饰器,从而实现不同的行为。 3、通过使用不同的具...

DoubleC的博客 304

android常用设计模式之装饰者模式

一.定义 装饰者模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 二.使用场景 1.需要扩展一个类的功能,或给一个类添加附加职责。 2.需要动态的给一个类添加和撤销一个功能。 三.优缺点 优点 扩展对象功能,灵活性高。 缺点 增加复杂性 四.角色 1.Component(抽象...

认真做事,开心生活 1502

android 装饰着模式,Android与设计模式——装饰者(Decorator)模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述装饰(Decorator)模式的:装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。装饰模式的结构装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展。(上文来源于...

weixin_28936835的博客 362

装饰设计模式在Android开发中的应用

1. 模式定义 装饰设计模式也称包装设计模式,用来动态的扩展对象的功能,也是继承关系的的一种替代方案之一。在不使用的继承的方式下,采用装饰设计模式可以扩展一个对象的功能,可以使一个对象变得越来越强大。 2. Android 源码的学习和思考 相信用过 ListView 的朋友都知道,ListView 有自带的方法可以添加 header 和 footer,那么 ListView 是怎样做到的呢? L...

Androidtalent的博客 402

设计模式-装饰模式

1.装饰模式的定义及使用场景定义:装饰模式也称为包装模式,结构型设计模式之一,其使用一种对客户端透明的方式来动态地扩展对象的功能,同时它也是继承关系的一种替代方案之一。动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活使用场景: 需要扩展一个类的功能,或给一个类增加附加功能 需要动态地给一个对象增加功能,这些功能可以再动态地撤销 需要为一批的兄弟类进行改装或加装功能,当

黄俊彬 1627

Android设计模式——装饰者模式

先说定义:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。 这个模式属于结构型模式,比如我们给给自己的手机贴了膜,套上手机套,这就变成了一个不怕摔的手机,本质上还是手机,但是多了不怕摔的特性。所以,对于一个类,当要在不改变它的本质的基础上扩展一个类的时候,就需要装饰装饰了。 举一个在源码中的例子,就是大家很熟悉的Context: Context是一个抽象类,...

jiujiaopanduola的博客 298

小白自我提高学习设计模式笔记(三)—装饰者模式在Android开发的小试

装饰者模式项目中的应用 在一个Android应用开发中,在Application中可以通过调用registerActivityLifecycleCallbacks()来实现对Activity的生命周期进行监听,那么有的时候需要监听Activity的生命周期来实现下面几个功能: (1)通过监听Activity的生命周期来统计应用中打开的未被finish()的Activity,在应用完全退出的时候,将未被关闭的Activity执行finish(),防止在应用退出的时候黑屏显示; (2)通过监听Activi

nihaomabmt的专栏 1764

装饰设计模式——学习篇

Android学习 装饰设计模式 装饰设计模式也称包装设计模式,用来动态的扩展对象的功能,也是继承关系的的一种替代方案之一。 通俗理解,在不使用的继承的方式下,采用装饰设计模式可以扩展一个对象的功能,可以使一个对象变得越来越强大。 下面通过一个Demo来理解下装饰设计模式 调用代码 PersonEat eat = new PersonEat(); //这是没有装饰过的 只能吃困穷菜 ea...

weixin_43850593的博客 164

应用装饰器模式来装饰Android上的视图

嗨,您好! 今天,我将展示如何利用其依赖注入的概念将设计模式装饰器应用于android的视图。 我认为这是一种很好的,清晰而简单的装饰视图的方式,而这就是我与您共享的动力。 我假设您已经知道装饰器模式,并且正在寻找涉及android的真实示例。 如果您想了解其背后的概念,这也是一篇不错的文章,但是您可能需要首先学习基础知识。 那里有一堆好书。 我个人建议先行。 在此示例中,我将尝试展...

220

Java设计模式之装饰者模式

装饰者模式 装饰者模式,顾名思义,它可以装饰一个类,在一个已有的类上动态增加一些新的行为和功能,从而不必改变它本身。 举一个通俗的例子,有一名化妆师和一个女孩,当这个女孩想要获得漂亮的外表时,通过化妆师对她进行的一番化妆她便就可以拥有,而不必通过整容来改变自己的身体结构获得这些,并且这个化妆是随时的,当她想要变漂亮的时候再化就行了。这里的化妆师就是装饰者模式,女孩就是类,漂亮的外表就是增加额外...

Ever69的博客 432

powerDesigner绘制类图

powerDesigner绘制类图

zhouguizhi 4万+
上一篇: java 线程池详解
下一篇: java 序列化和反序列化
zhoushenxian
博客等级 码龄12年 453粉丝 549原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值