• 6大设计模式(4):接口隔离原则


    接口隔离原则:

    接口分两种:

    实例接口:Java中的类

    类接口:interface定义的接口

    原则的两种定义:

    1.client不应该依赖它不须要的接口

    2.类间的依赖关系应该建立在最小的接口上

    须要对接口进行细化。保持清纯性。

    接口尽量细化,同一时候接口中的方法尽量少,增强专门性。

    接口隔离原则是对接口进行规范约束,包括4层含义:

    1.接口要尽量小

    这是原则的核心定义。可是小也是有限度的,不能违反单一 职责原则。

    2.接口要高内聚

    什么是高内聚?就是提高类、接口的处理能力。降低对外的交互。

    类提供一个方法。你仅仅须要知道调用这种方法就能够实现一系列的功能,可是详细是如何实现的就不知道了。详细到接口隔离原则就是在接口中尽量少的发布public方法。

    3.定制服务

    单独为当中的某一模块抽象成一个接口。

    4.接口的设计是有限的

    需求总是在变化的。

    用书中的样例“星探寻找美女”来进一步理解上述四个含义。

    首先得有一个美女的接口和星探的抽象接口:

    interface IPrettyGirl {
    	// 长得好看
    	public void goodLooking();
    
    	// 身材好
    	public void niceFigure();
    
    	// 有气质
    	public void greatTemperament();
    }
    
    abstract class AbstractSearcher {
    	protected IPrettyGirl prettyGirl;
    
    	public AbstractSearcher(IPrettyGirl prettyGirl) {
    		this.prettyGirl = prettyGirl;
    	}
    
    	public abstract void show();
    }


     

    实现美女类和星探类:

    class PrettyGirl implements IPrettyGirl {
    
    	private String name;
    
    	public PrettyGirl(String name) {
    		this.name = name;
    	}
    
    	@Override
    	public void goodLooking() {
    		System.out.println(name + "--->脸蛋非常美丽");
    	}
    
    	@Override
    	public void niceFigure() {
    		System.out.println(name + "--->身材非常好");
    	}
    
    	@Override
    	public void greatTemperament() {
    		System.out.println(name + "--->气质好");
    	}
    
    }
    
    class Searcher extends AbstractSearcher {
    
    	public Searcher(IPrettyGirl prettyGirl) {
    		super(prettyGirl);
    	}
    
    	@Override
    	public void show() {
    		System.out.println("-----美女信息例如以下-----");
    		// 展示面容
    		super.prettyGirl.goodLooking();
    		// 展示身材
    		super.prettyGirl.niceFigure();
    		// 展示气质
    		super.prettyGirl.greatTemperament();
    	}
    
    }


     

    场景类:

    public class Client {
    
    	public static void main(String[] args) {
    		IPrettyGirl girl = new PrettyGirl("圆圆");
    		AbstractSearcher searcher = new Searcher(girl);
    		searcher.show();
    	}
    }


     

    可是美女并不一定都是满足长得美丽、身材好、有气质这三个条件。仅仅满足当中一个也能够算是一个“美女”。仅仅只是不是那么完美罢了。比方说。背影杀手。

    那么详细到这个程序我们应该怎么去实现呢?PrettyGirl实现IPrettyGirl接口里的所有方法,所以仅仅能对IPrettyGirl接口进行拆分、细化。拆分成两个或几个接口。这个视需求而定。

    如果我们将美女分为气质型美女和外形美的美女,这样就是两个接口。外形美女也能够分成 (脸)长得美丽的美女和身材好的美女。这样就是拆分成三个接口。各自是:IGoodLookingGirl、INiceFigureGirl、IGreatTemperamentGirl。

    美女的接口及实现类:

    interface IGoodLookingGirl {
    	public void goodLooking();
    }
    
    interface INiceFigureGirl {
    	public void niceFigure();
    }
    
    interface IGreatTemperamentGirl {
    	public void greatTemperament();
    }
    
    // 长得好看的美女
    class GoodLookingGirl implements IGoodLookingGirl {
    
    	private String name;
    
    	public GoodLookingGirl(String name) {
    		this.name = name;
    	}
    
    	@Override
    	public void goodLooking() {
    		System.out.println(name + "--->脸蛋非常美丽");
    	}
    }
    
    // 身材好的美女
    class NiceFigureGirl implements INiceFigureGirl {
    
    	private String name;
    
    	public NiceFigureGirl(String name) {
    		this.name = name;
    	}
    
    	@Override
    	public void niceFigure() {
    		System.out.println(name + "--->身材好");
    	}
    
    }
    
    // 有气质的美女
    class GreatTemperamentGirl implements IGreatTemperamentGirl {
    
    	private String name;
    
    	public GreatTemperamentGirl(String name) {
    		this.name = name;
    	}
    
    	@Override
    	public void greatTemperament() {
    		System.out.println(name + "--->有气质");
    	}
    
    }
    
    // 完美
    class PrettyGirl implements IGoodLookingGirl, INiceFigureGirl,
    		IGreatTemperamentGirl {
    
    	private String name;
    
    	public PrettyGirl(String name) {
    		this.name = name;
    	}
    
    	@Override
    	public void greatTemperament() {
    		System.out.println(name + "--->有气质");
    	}
    
    	@Override
    	public void niceFigure() {
    		System.out.println(name + "--->身材好");
    	}
    
    	@Override
    	public void goodLooking() {
    		System.out.println(name + "--->脸蛋非常美丽");
    	}
    
    }

    星探的接口及实现类:

    abstract class AbstractSearcher {
    	protected PrettyGirl prettyGirl;
    	protected GoodLookingGirl goodLookingGirl;
    	protected GreatTemperamentGirl greatTemperamentGirl;
    	protected NiceFigureGirl niceFigureGirl;
    
    	public AbstractSearcher(PrettyGirl prettyGirl) {
    		this.prettyGirl = prettyGirl;
    	}
    
    	public AbstractSearcher(IGoodLookingGirl goodLookingGirl) {
    		this.goodLookingGirl = (GoodLookingGirl) goodLookingGirl;
    	}
    
    	public AbstractSearcher(IGreatTemperamentGirl greatTemperamentGirl) {
    		this.greatTemperamentGirl = (GreatTemperamentGirl) greatTemperamentGirl;
    	}
    
    	public AbstractSearcher(INiceFigureGirl niceFigureGirl) {
    		this.niceFigureGirl = (NiceFigureGirl) niceFigureGirl;
    	}
    
    	public abstract void showPrettyGirl();
    
    	public abstract void showGoodLookingGirl();
    
    	public abstract void showNiceFigureGirl();
    
    	public abstract void showGreatTemperamentGirl();
    }
    
    class Searcher extends AbstractSearcher {
    
    	public Searcher(IGoodLookingGirl goodLookingGirl) {
    		super(goodLookingGirl);
    	}
    
    	public Searcher(INiceFigureGirl niceFigureGirl) {
    		super(niceFigureGirl);
    	}
    
    	public Searcher(IGreatTemperamentGirl temperamentGirl) {
    		super(temperamentGirl);
    	}
    
    	public Searcher(PrettyGirl prettyGirl) {
    		super(prettyGirl);
    	}
    
    	@Override
    	public void showPrettyGirl() {
    		super.prettyGirl.goodLooking();
    		super.prettyGirl.niceFigure();
    		super.prettyGirl.greatTemperament();
    	}
    
    	@Override
    	public void showGoodLookingGirl() {
    		super.goodLookingGirl.goodLooking();
    	}
    
    	@Override
    	public void showNiceFigureGirl() {
    		super.niceFigureGirl.niceFigure();
    	}
    
    	@Override
    	public void showGreatTemperamentGirl() {
    		super.greatTemperamentGirl.greatTemperament();
    	}
    
    }


     

    场景类:

    public class Client {
    
    	public static void main(String[] args) {
    		IGoodLookingGirl goodLookingGirl = new GoodLookingGirl("冰冰");
    		INiceFigureGirl niceFigureGirl = new NiceFigureGirl("圆圆");
    		IGreatTemperamentGirl greatTemperamentGirl = new GreatTemperamentGirl(
    				"芳芳");
    		PrettyGirl prettyGirl = new PrettyGirl("张三");
    		AbstractSearcher goodlookingGirlsearcher = new Searcher(goodLookingGirl);
    		AbstractSearcher niceFigureGirlSearcher = new Searcher(niceFigureGirl);
    		AbstractSearcher greatTemperamentGirlSearcher = new Searcher(
    				greatTemperamentGirl);
    		AbstractSearcher prettyGirlSearcher = new Searcher(prettyGirl);
    
    		goodlookingGirlsearcher.showGoodLookingGirl();
    		niceFigureGirlSearcher.showNiceFigureGirl();
    		greatTemperamentGirlSearcher.showGreatTemperamentGirl();
    		prettyGirlSearcher.showPrettyGirl();
    
    	}
    }


     

    执行结果:

    冰冰--->脸蛋非常美丽
    圆圆--->身材好
    芳芳--->有气质
    张三--->脸蛋非常美丽
    张三--->身材好
    张三--->有气质

    写完之后本人就懵了,事实上写的过程中就已经懵了,越写越认为理解的有问题。怎么会这么麻烦。

    。。

  • 相关阅读:
    【JS教程08】数组及操作方法
    【JS教程07】事件属性及匿名函数
    【JS教程06】操作元素
    【JS教程05】获取元素的方法
    【JS教程04】条件语句
    多线程环境下非安全Dictionary引起的“已添加了具有相同键的项”问题
    GPT分区基础知识及如何在GPT分区上安装WIN7
    Jenkins TFS配置
    windows查看端口占用命令
    VS2015企业版序列号
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5367209.html
Copyright © 2020-2023  润新知