(一)开闭原则OCP
定义:软件中的对象(类,模块,函数)应该对于扩展是开放的,但是对于修改时封闭的
原因:在软件的生命周期内,因为变化,升级和维护等原因需要对软件原有代码进行修改时,可能会将错误引入原本已经经过测试的旧代码中,破坏原有系统,因此,因该尽量通过扩展的方式来实现变化
(二)里氏替换原则
核心:抽象,抽象又依赖进程这个特性
继承的优缺点:
优点:
(1)代码重用,减少创建类的成本,每个子类都拥有父类的方法和属性
(2)子类与父类基本相似,但又与父类有所区别
(3)提高代码的扩展性
缺点:
(1)继承时侵入性的,只要继承就必须拥有父类的所有属性和方法
(2)可能造成子类代码冗余,灵活性降低
public class Window {
public void show(View view){
view.draw();
}
}
public abstract class View {
public void measure(int width,int height){}
abstract void draw();
}
public class TextView extends View{
@Override
void draw() {
//自己的绘制方式
}
}
public class ImageView extends View{
@Override
void draw() {
//自己的绘制方式
}
}
这里指的就是里氏替换原则,可以自定义各式各样的view,然后传递给window,window负责组织view,并将view显示到屏幕上
(三)迪米特原则
原理:一个对象应该对其他对象有最少的了解,调用者或依赖者只需要知道它的方法即可,其他的可以不用管,类与类之间关系越紧密,耦合度越大,当一个类发生改变时,对另一个类的影响也越大
public class Room {
public float area;
public float price;
public Room(float area,float price){
this.area = area;
this.price = price;
}
}
public class Mediation {
private List<Room> mRoomList = new ArrayList<>();
public Mediation(){
for (int i = 0 ; i < 5 ; i++){
mRoomList.add(new Room(14 + i,(14 + i) * 1000));
}
}
public List<Room> getRoom(){
return mRoomList;
}
}
public class Person {
private List<Room> mRoomList;
public void getRoom(){
Mediation mediation = new Mediation();
mRoomList = mediation.getRoom();
for (Room room : mRoomList){
if (room.price == 1500 && room.area == 15){
Log.d("TAG", "I find a room ");
}
}
}
}
从上面的代码中可以看到,person中不仅依赖Mediation,还依赖Room,如果都把这些检测条件放到person中,那么Mediation的作用将会很小,当Room变化时,Person也需要变化,而person与Mediation耦合,这就出现纠缠不清的情况,这个时候要分清谁才是真正的朋友。
要明确的是,我们只和我们的朋友通信
public class Mediation {
private List<Room> mRoomList = new ArrayList<>();
private float area;
private float price;
public Mediation(float area,float price){
this.area = area;
this.price = price;
for (int i = 0 ; i < 5 ; i++){
mRoomList.add(new Room(14 + i,(14 + i) * 1000));
}
}
public Room getRoom(){
for (Room room : mRoomList){
if (room.price == price && room.area == area){
return room;
}
}
return null;
}
}
public class Person {
private Room mRoomList;
public void getRoom(){
Mediation mediation = new Mediation(15,1500);
mRoomList = mediation.getRoom();
}