七大设计原则之依赖倒转

首页 » 设计模式 » 七大设计原则之依赖倒转
  • 高层模块不应该依赖低层模块,二者都应该依赖其抽象
  • 抽象不应该依赖细节,细节应该依赖抽象
  • 依赖倒转(倒置)的中心思想是面向接口编程
  • 依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多,以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在Java中,抽象就是接口或者抽象类,细节就是具体的实现类
  • 使用接口或者抽象类的目的就是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成。

违反原则例子

package 依赖倒转;

public class test {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Person per=new Person();
  per.receive(new Email());
 }

}
class Email{
 public String getinfo() {
  return "电子邮件信息:hello,world";
 }
}
//完成接收消息
/*
 * 这种方式的问题
 * 如果不是从电子邮件获取,而是从qq接收,则要新增类,同时Person也要增加相应的接收方法
 */
class Person{
 public void receive(Email email) {
  System.out.println(email.getinfo());
 }
}

改进

package 依赖倒转;

public class test {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Person per=new Person();
  per.receive(new Email());
  per.receive(new Weixin());
  
  System.out.println("---------------------------------接口");
  changhong d=new changhong();//因为changhong实现类ITV接口,所以能接收
  open o=new open();
  o.open(d);
  
  System.out.println("---------------------------------构造方法");
  changhong2 d2=new changhong2();
  open2 o2 = new open2(d2);
  o2.open();
  
  System.out.println("---------------------------------setter");
  changhong3 d3=new changhong3();
  open3 o3 = new open3();
  o3.setTv(d3);
  o3.open();
  
 }

}
class Email implements IReceiver{
 @Override
 public String getinfo() {
  return "电子邮件信息:hello,world";
 }
}
//完成接收消息
/*
 * 解决思路:引入一个抽象的接口,表示接受者,这样Person类与接口发生依赖
 * 因为Email,QQ等等属于接收的范围
 */
class Person{
 public void receive(IReceiver receiver) {
  System.out.println(receiver.getinfo());
 }
}
class Weixin implements IReceiver{

 @Override
 public String getinfo() {
  // TODO Auto-generated method stub
  return "微信信息:OK ";
 }
 
}
interface IReceiver{
 public String getinfo();
}


/***********************************************
通过接口传递实现依赖
*/

class changhong implements ITV{

 @Override
 public void play() {
  // TODO Auto-generated method stub
  System.out.println("长虹电视打开了");
 }
 
}
//开关
interface IOpenandclose{
 public void open(ITV tv);
}
interface ITV{
 public void play();
}
//实现接口
class open implements IOpenandclose{
 public void open(ITV tv) {
  tv.play();
 }
}

/***********************************************
通过构造方法传递实现依赖
 */
class changhong2 implements ITV2{

 @Override
 public void play() {
  // TODO Auto-generated method stub
  System.out.println("长虹电视打开了");
 }
 
}
interface IOpenandclose2{
 public void open();
}
interface ITV2{
 public void play();
}
class open2 implements IOpenandclose2{
 public ITV2 tv;
 public open2(ITV2 tv) {
  this.tv=tv;
 }
 public void open() {
  this.tv.play();
 }
}

/***********************************************
通过setter方法传递实现依赖
 */
class changhong3 implements ITV3{

 @Override
 public void play() {
  // TODO Auto-generated method stub
  System.out.println("长虹电视打开了");
 }
 
}
interface IOpenandclose3{
 public void open();
 public void setTv(ITV3 tv);
}
interface ITV3{
 public void play();
}
class open3 implements IOpenandclose3{
 private ITV3 tv;
 public void setTv(ITV3 tv) {
  this.tv=tv;
 }
 public void open() {
  this.tv.play();
 }
}

 

分享到:
赞(0) 打赏

评论 2

评论前必须登录!

 

  1. #1

    以后多发点哦

    我也是渣渣3个月前 (05-26)
  2. #2

    我也是学计算机的

    hello3个月前 (05-26)

觉得文章有用就打赏一下弟弟吧

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.5主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
正在播放:

作者想对您说:

累了就停下来听首歌吧

听完后会给您一个好心情

最后

等到您不容易

还希望您能多待一会儿

      00:00/00:00

      登陆仅提取账号昵称,并无其他功能。

      为了服务器更好的运行,请使用第三方账号登陆。

      授权名称使用的公安备案名称——菜鸟奋斗历程,请知悉。