面向对象的三大特征,五大原则(一)
当你注意到设计模式的时候,我相信你已经在编程的道路上走的一段不短的路程了,同时也被需求的改变,多次的改变代码感到的厌烦。此时设计模式就正好可以解决我们的问题。
我学设计模式也有一段时间了,在我的理解中设计模式只不过是固定的一些套路,其中的核心思想还是面向对象的三大特征和五大原则
五大原则
一.单一职责原则(SRP)
职责单一原则的核心也就这么一段话:一个类有且只有一个引起它变化的原因,如果职责过多,功能过多,那么方法也会变化,方法只完成一个功能,类也只完成一个功能。
下面我为大家举个例子:
public class PasswordVerification{
public void login(String username,String password){
if(validate(password)== false){
return;
}
//操作数据库,判断用户密码对不对
}
public boolean validate(String password){
boolean result = false;
if(password==null) {
throw new RuntimeException("not blank");
}else if(password.length() <6){
System.out.println("密码长度不能小于6");
}else{
result = true;
}
return result;
}
}
上面代码的代码就是符合单一职责原则的类和方法,在PasswordVerification类中只是对密码进行验证,每个方法也只是执行一个功能。
二.开闭原则(ocp)
同样的想要理解好开闭原则,则必须要理解下面几句话:。
1.对功能的扩展示允许的。
2.增加功能或者修改功能通过新增代码来实现是允许的,是开放的。
3.对代码的修改是关闭的。
相信看到这里的时候大家多少会有点疑惑,首先第一点我相信大家都没有什么问题,关键是第二点,增加功能可以增加代码实现可以理解,但是修改功能,要靠增加代码实现?如何实现呢?
相信大家都有这样的一种感触就是修改代码最多的地方就是bug出现最多的地方,这样一来就会发现这个原则是非常必要的,那么如何做到呢?仔细想想,继承就是一个扩展了功能,但是没有修改任何已经存在的代码。
接下来我举个例子说明下:
dao层内容
public interface UserDao {
void insert();
}
public class SqlServerUserDao implements UserDao {
@Override
public void insert() {
System.out.println("插入到 sqlserver");
}
}
public class MySqlUserDao implements UserDao {
@Override
public void insert() {
System.out.println("插入到 mysql 数据库");
}
}
public class SomeClass {
public void doSth(){
System.out.println(" doSth in someclass");
}
}
public class SomeClassEx extends SomeClass {
@Override
public void doSth() {
System.out.println("1111");
}
}
用输出的语句代替连接的库数据类型。
service层内容
public class UserService {
private UserDao userDao = new SqlServerUserDao();
void insert(SomeClass someClass){
//其它一些业务处理的代码
someClass.doSth();
userDao.insert();
}
public static void main(String[] args) {
new UserService().insert(new SomeClassEx());
}
}
仔细看上面的代码,你就会发现通过给这个方法传递一个你新增的实现这个接口的类,这样这个方法的功能变了,但没有修改已有的任何代码。
三.依赖倒转原则(DIP):
关于这个原则我,还是一用一句话来概括:
抽象不应该依赖细节,细节应该依赖抽象,关于这个原则还有个说法就是,高层不应该依赖于底层,两者都应该依赖于抽象。
这句话的理解是其实就是依赖谁会更稳定的问题。这样说可能会有点抽象。我举个的例子结合来说下吧!
就像电脑中的主板上有很多的接口,有放置 CPU 的接口,有放置显卡的接口,而那些显卡厂商、CPU 厂商只需要生产出满足主板的接口要求的显卡与 CPU(比如多少个针脚,多长、多宽等)就可以用在电脑上了。这样我们的主板就可以使用任何的 CPU 与显卡,而不用一定只能使用某个特定厂商的CPU 与显卡。这远比那些集成显卡,CPU 的主板要好,因为只要这种集成的主板的显卡部件坏了,我们必须更换整个主板,而非集成模式的主板,只需要更换坏掉的显卡就可以了。 换句话来说,我们的主板依赖的那些 CPU、显卡的接口规范,而不是具体的 CPU、显卡这个具体的、明细的东西,反映在我们的程序中是如何处理呢?比如一个方法的参数尽量用比较顶级的类型,这样这个方法就不与某个具体的类耦合到一起了。
四.接口隔离原则
接口隔离原则,在我的理解中,把它理解成,接口分离原则更好一些,为什么呢,下面我举个例子说明下,比如现在我定义了一个鸟的行为的接口,定义了一个叫的方法,一个飞的方法,这样对于普通鸟类是没有问题的,但是鸵鸟,不会飞,所以对于鸵鸟来说这个飞的方法就很多余了。这个时候也就是我们说的接口污染。那么这个问题该怎么去解决呢?很简单,把鸟的行为接口分成两个接口,分别定义叫和飞的方法。这样就能很好的防止接口污染了。
网友评论