四、单一职责原则与接口分离原则

单一职责原则 (Simple Responsibility Pinciple,SRP)

这个原则其实很有意思,他规定每个类所拥有的能力必须明确划分,吃饭就吃饭,洗澡就洗澡,睡觉就睡觉,这保证了每个类的相互的能力不会互相污染,你不能一个吃饭的类居然可以出来洗澡的方法,这听起来就很荒谬。

如果你在学习的时候乐于查看源码,不难会有这样疑问:为什么我们看起来明明可以一步完成的操作他要写那么多封装类还有那么深的层次结构来完成,这很难理解。这也是源码学习晦涩难懂的一部分的原因。

但是,我还是那句话,如果站在更高层次来思考这个问题,不难发现设计者的良苦用心,职责分的细彼此之间相互耦合的可能性就小,功能也就方便维护,不过这个请适可而止,也并不是说吃饭功能你需要细节到吃哪一粒米,这没有必要,不必要的借口太多反而不好维护。你只要在怎么吃这个功能上细分就好。

今天呢,我还是去吃饭,不过饭店推出了简约套餐豪华套餐

简约套餐:做得很快,但是菜品很简单,很适合早餐,让我们在短时间内就可以完成吃饭动作。

豪华套餐:做得比简约套餐慢许多,但是菜品很丰富,很适合聚餐,晚餐这种有较多时间等待和享用的类型。
老样子,最简单的初版。对套餐(Set)进行编写。

public class Set{
    public void eat(String type){
        if("简约套餐".equals(type)){
            // print 选择简约套餐
        }else{
            // print 选择豪华套餐
        }
    }
}
public static void main(String[] ars){
    Set set = new Set();
    set.eat("简约套餐");
    set.eat("豪华套餐");
}

当然,写成这样还是老问题,就是开闭原则之类的问题。

不过有一点我想要说明的是,设计原则最多也还是参考作用,我们应该尽量遵守,因为真正的业务可能会让我们不得不打破一些看起来很美好的原则,所以比起强制套用设计原则,不如学会善用他们来解决让你挠头的业务问题。

回归正传,这个时候,饭店认为推出的简约套餐豪华套餐 销量不错,但是顾客觉得花样太单一了,于是为了回应顾客新的业务需求,我们就需要修改一下当初的设计,乘着还没有酿成大祸之前。

public class SimpleSet{
    public void eat(String type){
        System.out.println(type+": 简单快捷.");
    }
}
public class DiffSet{
    public void eat(String type){
        System.out.println(type+": 奢华大气.");
    }
}

我们将两种套餐分成了两个类,为了把他们的职责细分,不再像是以前全部的职责都放在了Food类中,避免了污染。

public static void main(String[] ars){
    DiffSet dset = new Diffset();
    dset.eat("奢华套餐");
    SimpleSet sset = new SimpleSet();
    sset.eat("简约套餐");
}

但这样感觉还是不够好,因为之前依赖倒置中讲过:高层模块与底层模块应该依赖抽象这一概念,所以我们使用接口来再次设计一下。

public interface ISet{
    void eat(String type);
}
public SimpleSetImpl implements ISet{
    //和之前一样
}
public DiffSetImpl implements ISet{
    //和之前一样
}
public static void main(String[] ars){
    ISet dset = new DiffsetImpl();
    dset.eat("奢华套餐");
    ISet sset = new SimpleSetImpl();
    sset.eat("简约套餐");
}

再回到我们新的需求的问题,我们可以有三种选择。

第一种,我们可以继承简约套餐,而重写里面eat方法。

public SimpleSetImplA extends SimpleSetImpl{
    @Override
    public void eat(String type){
        System.out.println(type+": A套餐");//简约的A套餐
    }
}
public SimpleSetImplB extends SimpleSetImpl{
    @Override
    public void eat(String type){
        System.out.println(type+": B套餐");//简约的B套餐
    }
}

第二种,我们所使用的SimpleSetImpl不应该使用,而应该使用抽象类,让所继承他的子类自由实现自己的套餐内容。也是我比较推荐的一种。

public abstract class DefaultSimpleSet implements ISet{
    //------------
    //*********** 以上是关于套餐的默认方法,表示一些固定的价钱和适用人群到底初始化
    public abstract void eat(String type);
    //让简单套餐的子类去具体实现吃的方法,继承的子类将会自动成为简约套餐的子项。
}
public SimpleSetImplA extends DefaultSimpleSet{
    @Override
    public void eat(String type){
        System.out.println(type+": A套餐");//简约的A套餐
    }
}
public SimpleSetImplB extends DefaultSimpleSet{
    @Override
    public void eat(String type){
        System.out.println(type+": B套餐");//简约的B套餐
    }
}

第三种,设计两个接口,一个是ISimpleSet,一个是IDiffSet接口,实现方法我直接贴出来。

public interface ISimpleSet{
    void eat(String type);
}
public interface IDiffSet{
    void eat(String type);
}

//这里只实现简约套餐
public class SimpleSetImpA implements ISimpleSet{
    //具体实现 A 套餐的 eat
}
public class SimpleSetImpB implements ISimpleSet{
    //具体实现 B 套餐的 eat
}

当然我想到了第四种。正好可以提前预热以下接口隔离原则

public interface ISimpleSet implements ISet{
    // eat 方法
    void simpleSetMethod();//简约套餐独有的方法
}
public interface IDiffSet implements ISet{
    // eat 方法
    void DiffSetMethod();//奢华套餐独有的方法
}

后面就和第三种方法一样。

总结一下单一职责,其实就是对功能的细分,并且要对将来的会发展成什么样子做出比较良好的架构,对面接口,这将会对你的拓展有很大帮助。

接口隔离原则 (Interface Segregation Principle, ISP)

是指用多个专门的接口,而不使用单一的总接口,客户端不应该依赖它不需要的接口。这个原则指导我们在设计接口时应当注意一下几点:
1、一个类对一类的依赖应该建立在最小的接口之上。
2、建立单一接口,不要建立庞大臃肿的接口。
3、尽量细化接口,接口中的方法尽量少(不是越少越好,一定要适度)。

代码我是我从别的地方粘贴过来的,这个大概的内容我其实在上面的四种方法一样,类应该只要依赖一个或者更少的接口。
并且每个都应该有明确的功能,用来区别接口的作用。

这里我就不再赘述了。

版权声明:本文为CSDN博主「PopCandier」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/CandyCCCation/article/details/88899480

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354