案例分析:设计模式与代码的结构特性

baike 2019-12-08

以策略设计模式为例:

1,什么是策略模式?
策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

2,策略模式有什么好处?
策略模式的好处在于你可以动态的改变对象的行.

3,设计原则
设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++z中可以用虚类),然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。下面是一个例子。
策略模式属于对象行为型模式,主要针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响 到客户端的情况下发生变化。通常,策略模式适用于当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。

4 ,策略模式中有三个对象:
(1) 环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。
(2) 抽象策略对象:它可由接口或抽象类来实现。
(3) 具体策略对象:它封装了实现同不功能的不同算法。
利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择有环境对象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。

5,应用场景举例:

刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开能解决棘手问题,嘿,还别说,真解决了大问题,搞到最后是周瑜陪了夫人又折兵,那咱们先看看这个场景是什么样子的。

先说说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是亮哥给的,妙计放在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊取出妙计,执行,然后获胜。

三个妙计是同一类型的东西,那咱就写个接口:

package com.yangguangfu.strategy;  
/** 
 *  
 * @author :阿福 
 * 首先定义一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口。 
 */  
public interface IStrategy {  
    //每个锦囊妙计都是一个可执行的算法。  
    public void operate();  

}

然后再写三个实现类,有三个妙计嘛:
  妙计一:初到吴国:

package com.yangguangfu.strategy;
/**
 * 
 * @author :阿福
 * 找乔国老帮忙,使孙权不能杀刘备。
 */
public class BackDoor implements IStrategy {

    @Override
    public void operate() {
        System.out.println("找乔国老帮忙,让吴国太给孙权施加压力,使孙权不能杀刘备...");
    }

}

妙计二:求吴国太开个绿灯,放行:

package com.yangguangfu.strategy;
/**
 * 
 * @author :阿福
 * 求吴国太开个绿灯。
 */
public class GivenGreenLight implements IStrategy {

    @Override
    public void operate() {
        System.out.println("求吴国太开个绿灯,放行!");

    }

}

妙计三:孙夫人断后,挡住追兵:

package com.yangguangfu.strategy;
/**
 * 
 * @author :阿福
 * 孙夫人断后,挡住追兵。
 */
public class BlackEnemy implements IStrategy {

    @Override
    public void operate() {
        System.out.println("孙夫人断后,挡住追兵...");

    }

}

好了,大家看看,三个妙计是有了,那需要有个地方放妙计啊,放锦囊里:

package com.yangguangfu.strategy;
/**
 * 
 * @author :阿福
 *
 */
public class Context {

    private IStrategy strategy;
    //构造函数,要你使用哪个妙计
    public Context(IStrategy strategy){
        this.strategy = strategy;
    }

    public void operate(){
        this.strategy.operate();
    }

}

然后就是赵云雄赳赳的揣着三个锦囊,拉着已步入老年行列的刘备老爷子去入赘了,嗨,还别说,诸葛亮的三个妙计还真不错,瞧瞧:

package com.yangguangfu.strategy;

public class ZhaoYun {

    /**
     * 赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计
     */
    public static void main(String[] args) {
        Context context;

        //刚到吴国的时候拆开第一个
        System.out.println("----------刚刚到吴国的时候拆开第一个---------------");
        context = new Context(new BackDoor());
        context.operate();//拆开执行
        System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");

        //当刘备乐不思蜀时,拆开第二个
        System.out.println("----------刘备乐不思蜀,拆第二个了---------------");
        context = new Context(new GivenGreenLight());
        context.operate();//拆开执行
        System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");

        //孙权的小追兵了,咋办?拆开第三个锦囊
        System.out.println("----------孙权的小追兵了,咋办?拆开第三个锦囊---------------");
        context = new Context(new BlackEnemy());
        context.operate();//拆开执行
        System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");
    }

}

6,解释多态机制

原理也很简单,父类或者接口定义的引用变量可以指向子类或者具体实现类的实例对象,由于程序调用方法是在运行期才动态绑定的,那么引用变量所指向的具体实例对象在运行期才确定。所以这个对象的方法是运行期正在内存运行的这个对象的方法而不是引用变量的类型中定义的方法。
  7,模块抽象封装的方法
封装,提供的对象隐藏内部特性和行为的一种能力,每个对象提供了一些方法,其他的对象可以访问并改变其内部数据。在Java中,提供了三种访问修饰符:公有的,私有的以及保护的。每个修饰符都设定了不同的访问权限,这个权限设置不会因为包的不同而有差异。
  8,各个模块的内聚度和模块之间的耦合度
内聚性,又称块内联系,指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。耦合度,是对模块间关联程度的度量。耦合的强弱取决与模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差。设计中通常用耦合度和内聚度作为衡量模块独立程度的标准。划分摸块的一个准则就是高内聚低耦合。
模块的内聚性和耦合性是两个相互对立且又密切相关的概念。一般是“高内聚,低耦合”。

相关推荐