初探架构中的设计原则---OOP设计思想进阶01

9 篇文章 0 订阅

前面的几篇文章中,相信大家对OOP的思维方式有了一定的了解,所谓面向对象,其实就是不断的去创建具有某种功能的类的对象,然后获取我们想要的功能即可。
回一下我们的猜单词小程序,你可能会有疑问,为什么要创建那么多类?为什么不把存放单词的SqlDemo类和判断用户的Judge类放在一起呢?还有用户输入数据包的Input类。
好了,下面来大家来思考一个问题。假设我们需要再添加一个功能,添加一个猜数字的小功能,我们应该怎么做呢?
当我们要加入一个可以猜数字的功能时,系统先要产生一个数字对不对,接着我们需要输入一个数字对吧,然后就是判断做校验了。思路和我们的猜单词的小程序一样,所以实现的步骤就先要在SqlDemo类中产生一个数字,然后需要用户输入一个数字。接着就是判断用户的输入了。 假设我们当初吧SqlDemo类和Judge类写在一起。
来看下面的代码:

package architecture;
/**
 * 
 * */
public class SqlDemo {
    //私有化构造方法,防止外部创建本类对象
    private SqlDemo() {

    }
    //私有化共享数据,防止外界对数据的篡改,保证数据的安全性
    private static String[] arr1= {"deprecated","category","figure","confirm","profile","argument"};
    private static String[] arr2= {"不赞成","类型","数字","确认","侧面","争论"};
    //产生随机数
    public static int produce() {
        int i= (int)(Math.random()*10+1);
        return i;
    }

    //对外提供公有的访问方法
    public static String getArr1() {
        int i= (int)(Math.random()*arr1.length);
        System.out.println(arr1[i]);
        return arr2[i];
    }
    //判断方法
    public static boolean contrast(String arr1,String arr2) {
        return arr1.equals(arr2);   
    }
}

可以看到上述的代码中添加了一个产生随机数的方法。该方法就是我们需要添加的功能的一部分了。接着再来看,我们还需要一个用户输入数字的功能,看下面的看代码:


import java.util.Scanner;

/**
 * 用来实现用户从键盘输入一个字符串的功能
 * 
 */
public class Input {

    //私有化构造方法,防止外部创建本来对象
    private Input(){

    }
    // 创建键盘录入对象
    Scanner in = new Scanner(System.in);

    public String getAns() {
        // 接受用户的输入值
        String sum = in.nextLine();
        // 返回用户输入的值
        return sum;
    }
    //获取用户输入的一个数字
    public int getNumber() {
        int sum = in.nextInt();
        return sum;
    }
    //对外提供共有方法,返回一个本类对象
    public static Input getInput() {
        return new Input();
    }
}

在输入的类中我们添加了一个输入数字的方法getNumber,这时,我们还需要一个判断的方法,因此回到SqlDemo类中:

package architecture;
/**
 * 
 * */
public class SqlDemo {
    //私有化构造方法,防止外部创建本类对象
    private SqlDemo() {

    }
    //私有化共享数据,防止外界对数据的篡改,保证数据的安全性
    private static String[] arr1= {"deprecated","category","figure","confirm","profile","argument"};
    private static String[] arr2= {"不赞成","类型","数字","确认","侧面","争论"};
    //产生随机数
    public static int produce() {
        int i= (int)(Math.random()*10+1);
        return i;
    }

    //对外提供公有的访问方法
    public static String getArr1() {
        int i= (int)(Math.random()*arr1.length);
        System.out.println(arr1[i]);
        return arr2[i];
    }
    //判断方法
    public static boolean contrast(String arr1,String arr2) {
        return arr1.equals(arr2);   
    }
    public static boolean contrast(int i,int j) {
        return i==j;    
    }
}

看出来了什么??
是不是新增了一个contrast方法!!!
对!改进了后我们这个类中有两个contrast方法,名字是一摸一样!
ps:在Java中,这种情况是很常见的,这就是方法重载,定义是:方法名相同,但是参数列表不同。jvm在执行的时候会根据参数列表来判断具体执行哪一个方法。
好了,回到主题上。我们对SqlDemo类进行了改造之后,会产生什么样的问题呢?
emmm。。。。。
先不考虑这个吧,猜数字的功能模块已经差不多了,有了用户的输入,也有了系统的判断,接下来看看程序的执行类,Start类吧
当加入了猜数字的功能的时候,Start类肯定也要发生改变。可见这种情况下当程序中需要添加功能的时候,整个程序都需要发生变化。
回到我们之前的猜单词的小程序上,现在是不是知道了为什么当初我们要定义这么多类了。
如果你再细心点的话,你还会发现,每个类的功能多比较单一,即SqlDemo类只充当数据库的职责,Input类只负责是实现用户的输入功能。Judge类只负责判断用户的输入是否正确。你可能觉得为什么不把这些功能写到一个类中,这样只需要创建一个对象就能实现咱们想要的功能了。
但是,你在仔细的想想这一篇中,如果要添加一个功能模块呢??
如果你将所有的功能都定义到一个类中去的话这些功能之间就会产生关系,当你改变一个功能的时候你能够确保其他的功能不受影响么?这也就是为什么我要在猜单词的小程序中设计好几个类的原因—–增强程序的可扩展性。
在OOP架构的设计中,往往有这样一条基本的原则—-类的单一职责原则
所谓类的单一职责原则,就是一个类只能包含一种功能,而该类的对象的任务就是完成自己的职责,不用去管其他的功能,不好理解????没关系!
其实单一职责原则的核心思想就是,系统中的每一个对象都应该只有一个单独的职责,而所有的对象只关注自己需要做的就可以了。
在程序设计中,有一条基本的规则就是被高内聚低耦合!其实这句话就是说类的功能应该单一。一个类的功能如果比较多的话,即有多个职责的时候。导致该类发生变化的因素也就越多。也就是说,当你改变其中的某一个功能的时候,难免不会对其他的功能造成影响。
一般情况下,我们在设计一个类的时候会把于该类有关的操作都组合到这个类中,这样做的后果就是可能将多个职责耦合到了一块去了。这样程序就显得比较僵硬。那么怎么解决这问题呢?
毫无疑问,问题的根本在于多个功能之间产生了关系,那么我们将还关系解除即可,在程序设计中叫分耦
即将不同的职责单独进行封装,不要将其组合在一个类中,
这样做的好处就是当后期程序的维护和升级多比较方便,程序显得更加的灵活。
好了,相信大家已经初步的认识了一下设计原则了吧,
下一篇博文中
em。。。。。。。。。。。。。。。。。。。。。
将带着大家正式的体验其他的设计原则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值