您的位置:首页 > 运维架构 > 网站架构

《架构模式应用 ● 设计模式》之装饰者

2011-08-02 17:40 330 查看
/**************************************************************************************************

** 设计思想需要归纳与提炼,无论简单抑或复杂。当然方案未必是唯一的最佳路径,在总结

** 的过程中发现问题、改善问题;只有跳出业务,将复杂问题简单化,才能提纲挈领,寻找

** 共性与变化的制高点!

************************************************************************************************/

§案例场景:

1、交易订单有诸多分类,且每种类都有各自的附加业务规则与逻辑:

所以在保存订单时,我们往往会附加不同业务处理,以填充业务订单实体。

eg: 计算积分规则、业务类型、额外扩展信息处理

另外,在根据不同业务类型,获取订单扩展信息时,也需要额外附加职责。

2、参数校验

参数校验通常体现在提供服务的接口上,不同的接口、不同的业务类型会存在不同的参数、业务校验规则,抑或是横向、纵向扩展,这里是一个变化点。

§分析设计:

以上两类问题通常有个基本点,就是他们的事务处理大部分逻辑会有共性的表现,而后则是不同行为的修饰与扩展。

§设计实现:

1、 设计类图





2、 代码实现

订单修饰:

DepositOrderInfo orderInfo = new DepositOrderInfo();
                //订单主体
                IOrders orders = new MainOrder();
                //修饰
                orders = new ShopOrderDecorator(orders);
                //根据业务类型取得不同修饰对象
                InterfaceFactory factory = new InterfaceFactory();
                factory.PayChannel = payInfo.PayChannel;
                orders = factory.OrderDecoratorInstance(orders);
                //修饰
                orders = new MerchantOrderDecorator(orders);
                orders.FillOrderInfo(orderInfo, payInfo);
参数解析修饰:

IParameters parameters = new ParameterService();
                //单层修饰
                parameters = new ShopParameter(parameters);
                ShopParameterInfo payInfo = parameters.AnalyzeParameter<ShopParameterInfo>(requestInfo);
                //......

                //校验参数
                int returnCode = parameters.ValidateParameter(payInfo);
                if (returnCode != Consts.Success)
                {
                    return GetResponse(returnCode);
                }

3、主要示例代码

http://download.csdn.net/download/webwalker/7470273
§总结:

案例实现简单,没有多层修饰的行为,但是当存在多层修饰时,可以根据不同的业务类型与渠道,定义不同的修饰路径,完成多层修饰。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: