文档章节

设计模式(1)单一职责原则

欧阳飘
 欧阳飘
发布于 2017/05/03 15:20
字数 777
阅读 13
收藏 0

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

我们这里定义了这样的一个接口,包括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 {

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

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

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

    @Override
    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();
    }
}

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

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

/**
 * 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 {

    @Override
    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. 可读性较好,因为单一职责的原因,对某种职责的操作可以去具体的类中查看。

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

 

 

 

© 著作权归作者所有

欧阳飘
粉丝 0
博文 40
码字总数 15571
作品 0
乌鲁木齐
程序员
私信 提问
《JavaScript设计模式与开发实践》原则篇(2)—— 最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。 单一职责原则指导我们...

嗨呀豆豆呢
2018/12/30
0
0
编程中的那些套路——关于简单工厂模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 面向对象五大原则中有一点非常重要的原则:单一职责原则。 简单工厂模式就是遵循了这一原则,它让不同职...

gzchen
2018/08/27
0
0
《JavaScript设计模式与开发实践》最全知识点汇总大全

系列文章: 《JavaScript设计模式与开发实践》基础篇(1)—— this、call 和 apply 《JavaScript设计模式与开发实践》基础篇(2)—— 闭包和高阶函数 《JavaScript设计模式与开发实践》模式...

嗨呀豆豆呢
01/04
0
0
JavaScript设计模式总结

之前看过《JavaScript设计模式与开发实践》这本书,对书中的设计模式和一些相关案例也有了一定的了解,同时把这些设计模式的应用对应在在一些其他的项目中,进行了一些整理,如下仅供参考: ...

jefferyE
03/26
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
268
0

没有更多内容

加载失败,请刷新页面

加载更多

《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
今天
6
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
今天
7
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
今天
5
0
OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
1K
11
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
40
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部