对象导论系列---每个对象都提供服务
对象导论系列---每个对象都提供服务
将对象作为服务提供者来看待是一件伟大的简化工具,这不仅在设计过程中非常有用,而且当其他人试图理解你的代码或重用某个对象时,如果他们看出了这个对象所能提供的服务的价值,他会使调整对象以适应其设计过程变得简单得多。
当你正在试图开发或理解一个程序设计时,最好的方法之一就是将对象想像为“服务提供者”,程序本身将向用户提供服务,她将通过调用其它对象提供的服务来实现这一目的。你的目标就是去创建或者最好是在现有代码库中去寻找能够提供理想服务来解决问题的一系列对象。对象的“单一职责”是程序设计的基本要求之一,所以解决某个问题需要一系列对象。Java中非常重要的体系,如:IO系、容器系、多线程系、Socket系。。。她们都是有多个对象,并通过对象组合来解决复杂功能。体现了设计的核心:扩展性、灵活性、维护性。
将对象看作是服务提供者还有一个附带好处:她有助于提高对象的内聚性。高内聚是软件设计的基本要求之一:这意味着一个软件构件(例如一个对象,当然她也有可能是指一个方法或一个对象系)的各个方面“组合”的很好。初、中级设计人员在设计对象时所面临的一个问题是,将过多的功能都塞在一个对象中。在良好的面向对象设计中,每个对象都可以很好地完成一项任务,但是她并不试图做更多的事。
生产-消费模型:
生产-消费模型使用的场景非常多,直译场景就是:工厂-代理商,超市-顾客等,在Java大型异构系统(分布式)中,非常重要的消息中间件就是这种模型,其中有:生产消息服务提供者、消费消息服务提供者、存放消息服务提供者、维护消息服务提供者、消息实体服务提供者。
生产消息服务提供者:见名知意,职责就是生产消息;
消费消息服务提供者:见名知意,职责就是消费消息;
存放消息服务提供者:主要是负责存放生产出来的消息,类似于仓库。仓库是有容量的,所以还应该提供容量限制;
维护消息服务提供者:主要负责消息的维护,如:消费过的消息会有标签,这个服务会统一定时去清理;因为消息生产和消息是不对等,即不是生产出来必须立刻消费掉(M---N),
所以还应提供LRU规则,即生产出来很长时间没用,如果容量达到最大,这个服务要定时按照LRU规则进行清理,腾出空间供新生产出来的消息“入库”。
消息实体服务提供者:定义消息结构,并提供是否消费标签,以供消息维护服务来定时清理;
案例赏析:
(生产者:提供生产服务行为)
(消费者:提供消费服务行为)
(消息实体:提供定义消息实体、获取编号、主题、消息、设置是否消费等服务)
(消息仓库:提供消息入库、出库、是否超容量、当前容量等服务)
总结:所有的抽象都是用“每个对象都提供服务”的思想来设计生产-消费模式,虽然此模式还不完善,但是基本功能都有。并且每个对象都提供单一职责功能,符合面向对象设计的单一职责思想。
如果同学们有疑问或者想获取更多资源,可以加“张无忌”老师微信(17091005779),找老师获取。