OOAD之设计模式-结构模式

Windows Mobile开发:Native C++与.NET Compact Framework技术选型指南 在嵌入式移动开发中,Native代码与托管运行时的权衡是资源受限系统的核心命题。理解PE/COFF可执行格式与IL/JIT执行模型的本质差异,有助于把握性能确定性与开发敏捷性的根本张力。Native C++提供对内存、硬件和时序的完全控制,适用于工业PDA、实时采集等强确定性场景;而.NET Compact Framework通过精简类库与轻量级GC,在企业OA、快速迭代界面等业务密集型应用中显著降低全周期成本。二者并非替代关系,而是分层协作——Native承担‘第一公里’硬件初始化与‘最后一公里’数据落盘 阅读详情

一、结构模式

用于组织类对象之间的结构

1.1外观模式facade

为了便于用户使用,提供一键式对外操作方法。对于使用者来说,只需要知道怎么调用方法就行了。不需要知道内部设置和实现。

就像傻瓜相机一样。

目的是:简化客户程序与子系统之间的交互接口。

效果及实现要点
1.Façade模式对客户屏蔽了子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。
2.Façade模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。
3.如果应用需要,它并不限制它们使用子系统类。因此你可以在系统易用性与通用性之间选择。
4.通过一个高层接口让子系统和客户端不发生直接关联,使客户端不受子系统变化的影响。
5.Facade不仅仅针对代码级别,在构架上,特别是WEB应用程序的构架上,Facade的应用非常普遍。
适用性
1.为一个复杂子系统提供一个简单接口。
2.提高子系统的独立性。
3.在层次化结构中,可以使用Facade模式定义系统中每一层的入口。
4.从代码角度来说,如果你的程序有多个类是和一组其它接口发生关联的话可以考虑在其中加一个外观类型。
5.从应用角度来说,如果子系统的接口是非常细的,调用方也有大量的逻辑来和这些接口发生关系,那么就可以考虑使用Facade把客户端与子系统的直接耦合关系进行化解。你可能会说,子系统改了外观不是照样改?的确是需要改,但是如果客户端本身的工作已经比较复杂,或者说可能有多个需要调用外观的地方,这个时候外观的好处就体现了。

 

1.2装饰器模式decorator
Decorator模式,描述的就是对象间可能存在的多种组合方式,这种组合方式是一种装饰者与被装饰者之间的关系,因此封装这种组合方式,抽象出专门的装饰对象正是“封装变化”的体现。

目的是:动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

为了防止类爆炸(多次复用,叠加多次时)修饰类可以多次修饰主体类,可以叠加修饰。但是主体类低位不变,对外体现仍为主体。

装饰类继承主体类,并且组合一个主体类(反向组合)

Decorator模式的优点是提供了比继承更加灵活的扩展,通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。

让装饰角色还继承抽象构件角色也是装饰模式最大的特点,目的就是给抽象构件增加职责,对外表现为装饰后的构件。

让装饰角色拥有构件角色实例的目的就是让构件能被多个装饰对象来装饰。

在具体应用中可以灵活一点,不一定要有抽象构件和装饰角色。但是,装饰对象继承装饰对象并且拥有它实例的两大特点需要体现。

透明装饰一般通过在基类方法前后进行扩充实现,半透明装饰一般通过新的接口实现。

 

public abstract class 咖啡 {
	private int cost;
	
	public void setCost(int cost){
		this.cost = cost;
	}
	
	public abstract int getCost();
	
}


 

public abstract class 配料 extends 咖啡{
	private 咖啡 coffee;
	
	public 配料(咖啡 coffee){
		this.coffee = coffee;
	}
	
	public 咖啡 getCoffee(){
		return this.coffee;
	}
}
public class 卡布基诺 extends 咖啡{
	
	private int cost = 19;

	@Override
	public int getCost() {
		// TODO Auto-generated method stub
		return this.cost;
	}
}
public class 蓝山 extends 咖啡 {
	
	private int cost = 21;

	@Override
	public int getCost() {
		// TODO Auto-generated method stub
		return this.cost;
	}

}


 

public class 奶 extends 配料 {
	
	public 奶(咖啡 coffee){
		super(coffee);
	}
	
	@Override
	public int getCost() {
		// TODO Auto-generated method stub
		return this.getCoffee().getCost() + 5;
	}

}


 

public class 爱心 extends 配料 {

	public 爱心(咖啡 coffee){
		super(coffee);
	}
	
	@Override
	public int getCost() {
		// TODO Auto-generated method stub
		return this.getCoffee().getCost() + 50;
	}

}
 
1.3代理模式proxy

用户与要访问的目标是隔离的,为了访问而采用中间代理来实现。同时还能实现功能的新增,甚至替换掉原来的功能,但是用户不会有任何感觉。

代理一般继承与目标一致的父类或者目标本类。重写父类方法,首尾添加,中间调用父类的方法。

在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对象,如果直接访问会给系统带来不必要的复杂性,这时候可以在客户程序和目标对象之间增加一层中间层,让代理对象来代替目标对象打点一切。这就是本文要说的Proxy模式。

目的:为其他对象提供一种代理以控制对这个对象的访问。

Proxy模式根据种类不同,效果也不尽相同:

1.远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,也可是在另一台机器中。远程代理又叫做大使(Ambassador)。好处是系统可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。客户完全可以认为被代理的对象是局域的而不是远程的,而代理对象承担了大部份的网络通讯工作。由于客户可能没有意识到会启动一个耗费时间的远程调用,因此客户没有必要的思想准备。

2.虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。使用虚拟代理模式的好处就是代理对象可以在必要的时候才将被代理的对象加载;代理可以对加载的过程加以必要的优化。当一个模块的加载十分耗费资源的情况下,虚拟代理的好处就非常明显。

3.Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。

4.保护(Protect or Access)代理:控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。保护代理的好处是它可以在运行时间对用户的有关权限进行检查,然后在核实后决定将调用传递给被代理的对象。

5.Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。

6.防火墙(Firewall)代理:保护目标,不让恶意用户接近。

7.同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。

8.智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。

 

1.4桥梁模式

Bridge模式封装对象实现的依赖关系。将抽象部分与它的实现部分分离,使它们都可以独立地变化。抽象部分是指不同的事物在概念层次上的联系。分离是指让各部分的行为各自独立,或至少显式指出关联。

多个变化点无主次之分,一个类组合多个变化点(需要时,也可以变化为装饰器)

同时可以实现当一化职责,减少类数目,防止排列组合式的类爆炸。

目的:将每个抽象部分与实现部分分离,使它们都可以独立的变化。进而大大减少类的数目。最后再组合为一个整体,对外公布。

效果及实现要点
1.Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。
2.所谓抽象和实现沿着各自维度的变化,即“子类化”它们,得到各个子类之后,便可以任意它们,从而获得不同平台上的不同型号。
3.Bridge模式有时候类似于多继承方案,但是多继承方案往往违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。
4.Bridge模式的应用一般在“两个非常强的变化维度”,有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈——换言之两个变化不会导致纵横交错的结果,并不一定要使用Bridge模式。
适用性
在以下的情况下应当使用桥梁模式:
1.如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
2.设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
3.一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。
4.虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。

它很好的符合了开闭原则和优先使用对象,而不是继承这两个面向对象原则。

public abstract class Shap {
	private Line line;

	public Line getLine() {
		return line;
	}

	public void setLine(Line line) {
		this.line = line;
	}
	
	public abstract void paint();
}


 

public abstract class Line {
	
	public abstract void draw();

}


 

public class Rectangle extends Shap {
	
	private int x;
	private int y;
	private int width;
	private int high;
	
	@Override
	public void paint() {
		// TODO Auto-generated method stub
		System.out.println("计算矩形的大小、位置");
		this.getLine().draw();
	}

}


 

public class Circle extends Shap{
	
	private int x;
	
	private int y;
	
	private int r;
	
	@Override
	public void paint() {
		// TODO Auto-generated method stub
		System.out.println("计算圆的大小、位置");
		this.getLine().draw();
	}
	
	
	
}


 

public class DotedLine extends Line {

	@Override
	public void draw() {
		// TODO Auto-generated method stub
		System.out.println("虚线绘制");
	}

}


 

public class FullLine extends Line {

	@Override
	public void draw() {
		// TODO Auto-generated method stub
		System.out.println("实线绘制");
	}

}

 

1.5适配器模式adapter

基于已知类或接口功能,满足客户的需求。

继承一个类,在组合另外的类。实现通过一个类访问多个类的行为。综合利用已有的资源。

如果已经有了接口,那么创建一个类组合2个接口的实现类。重载接口的方法,方法中调用实现类的相应方法。

 

构建高效软件设计:OOAD与UML实战指南 本文还有配套的精品资源,点击获取 简介:面向对象分析与设计(OOAD)和统一建模语言(UML)是软件开发中关键的工具,有助于将现实世界问题转化为软件解决方案,并提供强大的软件设计能力。本指南从面向对象编程的基本原理出发,探讨了OOAD的基础概念以及如何通过UML的各种图表来可视化设计过程。学习OOAD与UML涉及需求收集、分析、设计、实现和测试等步骤,重点介绍如何将理论与实... 阅读详情

相关推荐

ooad设计模式软件架构分析资料

面向对象 软件架构 设计模式 软件分析 UML等所有方面的资料合集,英文原著

ooad设计模型

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。 项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之

guanslai的博客 801

UML与OOAD案例教学

火龙果软件学院的UML与 OOAD案例教学材料,通过案例的全过程仿真,体验项目开发的全过程

模拟操作系统实现-使用Java 实现。ooad

一、需求分析  通过模拟操作系统的实现,加深对操作系统工作原理理解,进一步了解操作系统的实现方法,并可练习合作完成系统的团队精神和提高程序设计能力。 该操作系统是模拟一个采用多道程序设计方法的单用户操作系统,该操作系统包括进程管理、存储管理、文件管理和用户接口四部分。 本实验所使用的编程语言是JAVA,开发工具是Eclipse,运行的操作系统是Windows7.   二、概要设计 说明

my home 5396

ooad设计模式_OOAD-面向对象的分析与设计

ooad设计模式 让我们分为以下几节来讨论OOAD: (Lets discuss OOAD bydividing into the below sections:) OOS 操作系统 OOA OOA OOD 面向对象 Thumbnails principles...

cunchi8090的博客 1242

OOAD与UML

1.1软件开发的复杂性软件开发的复杂性是软件设计与开发者的体验。具体有:? 很难精确表述出用户需求? 开发过程中用户需求经常变化? 用户需求常以大量的文本的形式表现出来,难以理解并互相冲突? 很难发现大型应用项目隐蔽着的复杂性? 人类本身处理复杂现象的能力有限? 很难预估最终输出的执行效果及其是否能满足用户的期望? 设计者遇到的最大挑战是为解决方案中的硬件挑选合适的软件除要克服上述复杂的问题,软件

ZhaoXiaoLong的专栏 1886

OOAD设计模式

一、模式: 避免重复问题,而提出来的解决方案。 模式又可以分为: 架构模式   设计模式   1.1架构模式 软件架构的上,整体考虑,而提出来的一些解决方案,比如:三层架构,B/S,C/S,MVC,ORM,事务脚本,领域模型……,从宏观的角度上来说   1.2设计模式 设计模式是从微观的角度上来看待软件开发过程中,碰到的一些重复业务场景,并提出的解决方案。   设计模式:创...

IT_CREATE的博客 1166

Using the WebBrowser Control from C/C++ (From MSDN)

Using the WebBrowser Control from C/C++This section describes some common implementations of the WebBrowser control in C/C++, including: WebBrowser Control Basics Adding Internet Brows

※旅程※ 6149

Webbrowser控件 怎么样禁用ActiveX [已结贴,结贴人:kingfun]

 Webbrowser控件 怎么样禁用ActiveX [已结贴,结贴人:kingfun] 加为好友 发送私信 在线聊天 kingfun 天杰 等级: 可用分等级:富农 总技术专家分:54

skyremember的专栏 1486

VC6 150个案例实战:从MFC到现代Windows开发的技能迁移与底层原理精解

Windows桌面应用开发的核心在于理解操作系统底层机制与图形用户界面框架。从Win32 API到MFC,其原理基于消息驱动与C++对象封装,为构建稳定、高效的本地应用程序提供了基础。掌握这些底层技术价值在于能够深入理解现代GUI框架(如Qt、WPF)的封装逻辑,并具备维护和现代化改造遗留系统的能力。在应用场景上,这涵盖了从工具软件、数据管理程序到嵌入式界面等广泛领域。本文聚焦于通过解析经典的Visual C++ 6.0应用案例,系统拆解MFC框架下的界面编程、文档视图架构、文件系统操作等核心模块,旨在帮助

weixin_34130389的博客 453

OOAD设计模式-创建模式

先来说说模式的概念吧。 模式就是:具有代表性的某些重复问题的解决方案,是进过多次证实,与业务无关的方案。 它们都有特定的名称和适用的环境。模式的使用为我们带来了复用性的提高和可维护性的提高,同时可以增强表达能力。因为它是整个解决方案的总结。 一、模式的主要分类 模式分为两大类:设计模式和架构模式。 根据group of four 定义的23种模式和MVC模式,总共有24种。 其中设计模

mudeer2012的专栏 1774

以下是关于面向对象编程(OOP)、面向对象分析与设计(OOAD)、UML(统一建模语言)和设计模式的核心概念与知识体系梳理

- **定义**:类是具有相同属性和方法的一组对象的抽象。它是对象的模板,用于创建对象。例如,“汽车”类可以定义所有汽车共有的属性(如颜色、品牌)和方法(如加速、刹车),然后通过实例化这个类来创建具体的汽车对象。 - **作用**:类提供了代码复用性,通过定义一个类,可以创建多个具有相同结构的对象,避免重复编写代码

[Blog][Domain] programb.blog.csdn.net 447

OOAD——面向对象的分析与设计

软件工程的概念;UML——统一建模语言;设计原则;设计模式(23种);架构模式(三层架构)

weixin_62993347的博客 717

OOAD复习笔记

OOAD学习目标:1.A critical,fundamental ability in OOAD is to skillfully assign responsibilities to software components.(面向对象分析设计种至关重要的的能力是熟练地为软件部件分配职能)2)GRASP patterns ,nine fundamental priciples in object...

LHF_debug的博客 2324

OOAD-设计模式(一)概述

前言   在我们很多时候设计代码都是需要用到各种不一样的设计模式的,接下来着几篇给大家领略一下设计模式。知道设计模式的作用,以及在代码的具体体现。很多时候我们看不懂代码就是因为我们不知道它使用的设计模式。   国庆的我很痛苦,学习是痛苦的,成长是快乐的! 一、什么是面向对象 1)面向对象(Object-Orientation,简称OO)是一种系统建模技术/编程思想。 2)面向对...

a878787877的专栏 390

OOAD设计模式

一、面向对象的概念 谈谈你对面对对象的理解: OOAD(Object Oriented Analysis Design):面对对象的分析和设计 面向对象(Object-Orientation,简称OO)是一种系统建模技术/编程思想。 面向对象编程(Object-OrientationProgramming,简称OOP)是按照OO的方法学来开发程序的编程方式。 OO: 面向对象,是

zxs123csdn的博客 2560

OOAD设计模式(三)

一.软件开发流程 客户提出需求--》系统开发结束交付客户 1.传统的软件开发流程---瀑布模型  1)把整个软件开发过程分成顺序相接的五个阶段,阶段间不可逆转 2)每个阶段必须完成全部规定的任务,并提交相应的文档 问题: 1)  只有项目生命周期的最后阶段才能发现问题 2)  不适应客户需求的变化   1. 迭代化开发流程 1)  将整个项目划分成多个阶段性小目标 2)  每

zxs123csdn的博客 749

OOAD设计模式解析

模式包含的要素 1.模式名称 2、该模式所能解决的问题 3、解决方案 4、使用该模式后的效果(优点和缺点) 模式 避免重复问题而提出来的解决方案 类型 架构模式 软件加构上的,整体考虑而提出来的一些解决方案,比如:B/S,C/S,MVC,ORM,事务脚本,领域模型……从宏观的角度来说 设计模式 是从微观的角度上来看软件开发过程中,碰到的一些重复业务场景并提出的解决方案。 设计模式分类 创建型设计模...

W_angpeng的博客 493
上一篇: OOAD之设计模式-创建模式
下一篇: OOAD之设计模式-行为模式
mudeer2012
博客等级 码龄14年 4粉丝 47原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值