硬设计2,刚才说桥接了,下面再说说桥接和状态,观察者,策略

上一篇《硬设计》
硬设计2,刚才说桥接了,下面再说说桥接和状态,观察者,策略。
这里,观察者是链式桥接。
观察者是通过一个状态指针的变化来变化桥接。
策略是选择这个不断换桥接指针。
这三种都是动态桥接,与基础桥接的指针不变不同。
那职责链的桥接指针是动态的还是静态的呢,一般是静态的,会形成一条桥接链。
观察者也是固定的,但是组合的是列表桥接。
如果更深入的分析,观察者模式的迭代器,其实也是链式桥接。
接着说
设计都有那些可规划的因数。
机能切割,这是最基本的设计。
和里的切割,对冗余,对耦合都是有影响的。
尽量将关系密切的机能放在一起。
切割的级别有如下几种。
模块,类,函数,现在C++11有了Lambda表达式,
所以,函数内部也可规划了。
多态这种属性的引入,为优雅的设计提供了更广阔的空间。
切割完了之后最主要的就是对关系的规划了。
当然这两种设计是不可能绝对的分开的。
是交叉进行的。
只是关系的设计要在机能切割的基础之上。
大体的机能切割之后,总会在后期遇到些难以切割的东西。
比如,放到哪里都觉得不合理。
放到哪里都觉得有冗余。
这时候,各种技术,各种模式就要上场了。
举例
比如再做函数内部规划的时候,有个2~3行的代码,在函数内部重复出现,靠内部逻辑整理,无法消除冗余。
这时候Lambda表达式上场了。
没了,问题解决了。
可规划的关系元素。
可选的有组和:数据成员变量,聚合:指针引用成员。
这里强调一下,如果能选择引用尽量选择引用不选指针,必须用指针的化,最好只读。
接着说,还可以选择,依赖和关联。
关联比依赖更近一点,
依赖,只依赖与另一个类的定义。说白了在c++就是头文件的依赖。
关联近一点,不紧依赖对象,还依赖成员和函数。
这个分类,个人觉得是不是很合理的。
对于面相接口的编程,接口和定义的级别差不多。
而成员一定是类的级别的。
关于关系这的设计,还是有很多技巧的。
不过我们就被这一个原则,关系越少越好,越远越好。
面相对象的5种关系:
1.一般,就是继承
2.组合,就是对象的依赖
3.聚会,就是对象的指针或引用的依赖。
这三种是最明确,且容易规划的关系。
4.联合
5.依赖
这两种关系应该尽可能的少,没有最好。
这两种关系如果过多,说明你对机能的切割不好。
这两种关系是最增加耦合度的。
这种关系,对设计者来说应该是不得不的关系。
是不是有人觉得,这种若关系,反而对系统的破坏更大呢。
理由是这样的:
一般(继承),组合,聚合,就像亲人和朋友一样。
有没有关系,近的相当于是一体的,明确简单。
而耦合者不一样,相当于陌生人。
实现如果你的系统里有那么多模式的关系,你不担心吗。
这种关系是不明朗,不一查觉的。
是在维护阶段最让人头痛,也最容易出bug的关系。
试想如果一个社会中,过多的模式关系,那运行的数度得多慢啊,警察得多累啊。
这里有两个设计原则
1 尽量减少这种关系,基本是废话吧
2 尽量将这样的关系同意处理,交给专人管理陌生关系。
不少了,下一篇吧
下一篇《软设计》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
25.1 场景问题 25.1.1 扩展客户管理的功能 考虑这样一个应用:扩展客户管理的功能。 既然是扩展功能,那么肯定是已经存在一定的功能了,先看看已有的功能:公司的客户分成两大类,一类是企业客户,一类是个人客户,现有的功能非常简单,就是能让客户提出服务申请。目前的程序结构如图25.1所示: 图25.1 已有的客户管理程序结构示意图 现有的实现很简单,先看看Customer的实现,示例代码如下: /** * 各种客户的父类 */ public abstract class Customer { /** * 客户编号 */ private String customerId; /** * 客户名称 */ private String name; /** * 客户提出服务请求的方法,示意一下 */ public abstract void serviceRequest(); } 下来看看企业客户的实现示例代码如下: /** * 企业客户 */ public class EnterpriseCustomer extends Customer{ /** * 联系人 */ private String linkman; /** * 联系电话 */ private String linkTelephone; /** * 企业注册地址 */ private String registerAddress; /** * 企业客户提出服务请求的方法,示意一下 */ public void serviceRequest(){ //企业客户提出的具体服务请求 System.out.println(this.getName()+"企业提出服务请求"); } } 再看看个人客户的实现示例代码如下: /** * 个人客户 */ public class PersonalCustomer extends Customer{ /** * 联系电话 */ private String telephone; /** * 年龄 */ private int age; /** * 企业注册地址 */ private String registerAddress; /** * 个人客户提出服务请求的方法,示意一下 */ public void serviceRequest(){ //个人客户提出的具体服务请求 System.out.println("客户"+this.getName()+"提出服务请求"); } } 从上面的实现可以看出来,以前对客户的管理功能是很少的,现在随着业务的发展,需要加强对客户管理的功能,假设现在需要增加如下的功能: 客户对公司产品的偏好分析,针对企业客户和个人客户有不同的分析策略,主要是根据以往购买的历史、潜在购买意向等进行分析,对于企业客户还要添加上客户所在行业的发展趋势、客户的发展预期等的分析。 客户价值分析,针对企业客户和个人客户,有不同的分析方式和策略。主要是根据购买的金额大小、购买的产品和服务的多少、购买的频率等进行分析。 其实除了这些功能,还有很多潜在的功能,只是现在还没有要求实现,比如:针对不同的客户进行需求调查;针对不同的客户进行满意度分析;客户消费预期分析等等。虽然现在没有要求实现,但不排除今后有可能会要求实现。 25.1.2 不用模式的解决方案 要实现上面要求的功能,也不是很困难,一个很基本的想法就是:既然不同类型的客户操作是不同的,那么在不同类型的客户里面分别实现这些功能,不就可以了。 由于这些功能的实现依附于很多其它功能的实现,或者是需要很多其它的业务数据,在示例里面不太好完整的体现其功能实现,都是示意一下,因此提前明一下。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值