博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式(1)单一职责原则
阅读量:6351 次
发布时间:2019-06-22

本文共 2285 字,大约阅读时间需要 7 分钟。

hot3.png

单一功能原则(Single responsibility principle)规定每个类都应该有一个单一的功能,并且该功能应该由这个类完全封装起来。所有它的(这个类的)服务都应该严密的和该功能平行

150859_wRRp_3013327.png

我们这里定义了这样的一个接口,包括setName,setColor,eat和sleep方法,那么这里应该很明显,所有的事情都要交给Dog的实现类去完成,其中setName,setColor可以认为是完成了属性设置的任务,而后面的eat和sleep则完成了Dog的具体动作。从这里可以看出这个接口提供的方法存在职责不单一的问题,当然话说回来,setName,setColor如果放在一个接口中,那就职责单一了吗?一个设置名称,一个是设置颜色,也不是完全的单一嘛,我在这里的看法是不要斤斤计较,过分的划分功能,会导致设计的复杂化,加大工作量,所以在这里我觉得职责在划分的时候,需要进行一个抽象的过程,将完成的功能相近的划分到一起我觉得就可以了。

public interface Dog {

   public void  setName(String name);
   
   public void  setColor(String color);
   
   public void eat(String food);
   
   public void sleep();
}

public class DogImpl implements Dog {

    

    public void setName(String name) {
         System.out.println("名字:"+name);
    }

    

    public void setColor(String color) {
        System.out.println("颜色:"+color);
    }

    

    public void eat(String food) {
        System.out.println("吃饭:");
    }

    

    public void sleep() {
        System.out.println("睡觉:");
    }

}

public class TestDesign {

    public static void main(String[] args) {
        Dog dog = new DogImpl();
        dog.setColor("黑色");
        dog.setName("贝贝");
        dog.eat("骨头");
        dog.sleep();
    }
}

那么我们应该怎么设计这个接口让它满足单一职责呢?

151338_jIk2_3013327.png

参考了《设计模式之禅》中的例子,将不同职责的操作分开到不同的接口中去

/**

 * Dog属性
 */
public interface DogProperties {
       //默认名称
       static final java.lang.String name="小黄";
       //默认颜色
       static final java.lang.String color="黄色";
       
       String setName(String name);
       
       String setColor(String color);
    
}

/**

 * Dog行为
 */
public interface DogAction {
   //吃饭
   public void eat();
   //睡觉
   public void sleep();
}

/**

 *
 * Dog的实际操作接口
 *
 */
public interface DogOperation extends DogAction, DogProperties {

}

/**

 *
 * Dog的实现
 *
 */
public class DogImp implements DogOperation {

    

    public void eat() {
        System.out.println("吃骨头");
    }

    @Override

    public void sleep() {
        System.out.println("睡觉");
    }

    @Override

    public String setName(String name) {
        return name;
    }

    @Override

    public String setColor(String color) {
        return color;
    }

}

public class TestDesign {

    public static void main(String[] args) {
        DogOperation  dog = new DogImp();
        String color = dog.setColor("白色");
        String name = dog.setName("小白");
        System.out.println(color);
        System.out.println(name);
        dog.sleep();
        dog.eat();
    }
    
}

这些代码比较简单,我这里就不再过多的说明了。

单一职责模式的优点

1. 降低了单个类的复杂性,尽量保证一个类中操作的类型一致

2. 可读性较好,因为单一职责的原因,对某种职责的操作可以去具体的类中查看。

单一职责原则,理论上我们要进行遵循的,但是往往实践中并不一定完全按照他的思路去设计,我的看法还是,尽量在完成业务需要的情况下,考虑按照单一职责原则对接口和类进行设计,类的设计过程中,不要过度的划分,适可而止就好。

 

 

 

转载于:https://my.oschina.net/u/3013327/blog/891355

你可能感兴趣的文章
fhq-treap小结
查看>>
about porting
查看>>
MySQL事务及ACID特性
查看>>
Hadoop_31_MapReduce参数优化
查看>>
linux运维常见英文报错中文翻译(菜鸟必知)
查看>>
[原][osgEarth]添加自由飞行漫游器
查看>>
代码审查 Code Review
查看>>
fastjson如何指定字段不序列化
查看>>
[日常] Go语言圣经--示例: 并发的Echo服务
查看>>
BZOJ1969: [Ahoi2005]LANE 航线规划(LCT)
查看>>
linux内存管理之malloc、vmalloc、kmalloc的区别
查看>>
GreenDao 数据库升级 连接多个DB文件 或者指定不同的model&dao目录
查看>>
M1卡破解(自从学校升级系统之后,还准备在研究下)【转】
查看>>
vue 访问子组件示例 或者子元素
查看>>
linux内核--自旋锁的理解
查看>>
银行卡的三个磁道
查看>>
OpenSSL 提取 pfx 数字证书公钥与私钥
查看>>
Keepalived详解(四):通过vrrp_script实现对集群资源的监控【转】
查看>>
CollapsingToolbarLayoutDemo【可折叠式标题栏,顺便带有CardView卡片式布局】
查看>>
CentOS7.4安装配置mysql5.7 TAR免安装版
查看>>