夜光序言:
人生是美好的,它不是冬天里的寒气伤心,它而是春暖花开的季节。
正文:
以道御术 / 以术识道
package 依赖倒转原则;
public class DependecyPass {
public static void main(String[] args) {
//我们先new两个对象出来~
ChangHong ch = new ChangHong();
OpenAndClose openAndClose = new OpenAndClose();
openAndClose.Open(ch);
}
}
class ChangHong implements ITV{
@Override
public void play() {
System.out.println("电视机已经打开");
}
}
//方式1:通过接口传递实现依赖
//开关的接口
interface IOpenAndClose{
public void Open(ITV tv); //抽象方法,接收接口
}
//ITV接口
interface ITV{
public void play();
}
//实现接口
class OpenAndClose implements IOpenAndClose{
@Override
public void Open(ITV tv){
tv.play();
}
}
//-------------------------------------------------------------------
/*
//第二种方式,夜光
//方式2:通过构造方法依赖传递
interface IOpenAndClose{
public void Open(); //抽象方法
}
interface ITV{ //ITV接口
public void play();
}
class OpenAndClose implements IOpenAndClose{
public ITV tv;
public OpenAndClose(ITV tv){
this.tv = tv;
}
@Override
public void Open(){
this.tv.play();
}
}*/
//-----------------------------------------------------------------
//方式3:
package 依赖倒转原则;
public class DependecyPass {
public static void main(String[] args) {
//我们先new两个对象出来~
ChangHong ch = new ChangHong();
/* OpenAndClose openAndClose = new OpenAndClose();
openAndClose.Open(ch);*/
//通过构造器进行依赖传递
OpenAndClose openAndClose = new OpenAndClose(ch);
openAndClose.Open();
}
}
class ChangHong implements ITV{
@Override
public void play() {
System.out.println("电视机已经打开");
}
}
/*//方式1:通过接口传递实现依赖
//开关的接口
interface IOpenAndClose{
public void Open(ITV tv); //抽象方法,接收接口
}
//ITV接口
interface ITV{
public void play();
}
//实现接口
class OpenAndClose implements IOpenAndClose{
@Override
public void Open(ITV tv){
tv.play();
}
}*/
//-------------------------------------------------------------------
//第二种方式,夜光
//方式2:通过构造方法依赖传递
interface IOpenAndClose{
public void Open(); //抽象方法
}
interface ITV{ //ITV接口
public void play();
}
class OpenAndClose implements IOpenAndClose{
public ITV tv;
public OpenAndClose(ITV tv){
this.tv = tv;
}
@Override
public void Open(){
this.tv.play();
}
}
//-----------------------------------------------------------------
//方式3:
package 里氏替换原则;
public class LisKov {
public static void main(String[] args) {
A a = new A();
System.out.println("11-3=" + a.func1(11,3));
System.out.println("-------------------------------");
B b = new B();
System.out.println(b.func1(11,3));
System.out.println(b.func2(11,1));
}
}
//写一个A类
class A{
public int func1(int num1,int num2){
return num1 - num2; //返回两个数的差
}
}
//再写一个B类
//B继承了A
//增加了一个新功能,完成两个数相加,并和9求和
class B extends A{
@Override
public int func1(int a,int b){
return a + b;
}
public int func2(int a,int b){
return func1(a,b) + 9;
}
}
package 里氏替换原则.优化;
//夜光:我们改进一下
public class LisKovImprove {
public static void main(String[] args) {
A a = new A();
System.out.println("11-3=" + a.func1(11,3));
System.out.println("-------------------------------");
B b = new B();
System.out.println(b.func1(11,3));
System.out.println(b.func2(11,1));
System.out.println("11-3:" + b.func3(11,3));
}
}
//优化:创建一个更加基础的基类
class Base{
//把更加基础的方法和成员写到base里面
}
//写一个A类
class A extends Base{
public int func1(int num1,int num2){
return num1 - num2; //返回两个数的差
}
}
//再写一个B类
//B继承了A
//增加了一个新功能,完成两个数相加,并和9求和
class B extends Base{
//如果B想要使用A的方法,我们使用组合
private A a = new A(); //画重点
/* @Override //这个方法无意中重写了父类的方法func1,造成了错误*/
//通用的做法是:原来的父类和子类都继承一个更通俗的基类,原有的继承关系去掉
//采用依赖,聚合,组合关系来代替
public int func1(int a,int b){
return a + b;
}
public int func2(int a,int b){
return func1(a,b) + 9;
}
//如果我们想要使用A的方法,可以使用里氏替换原则的组合
public int func3(int a,int b){
return this.a.func1(a,b); //this.a 指向 private A a = new A(); //画重点
}
}