前言

    本文依次逐个介绍 “实现”、“继承”、“依赖”、“引用”、“聚合”、“组合”;每一个以案例的形势进行表述

1,实现:Realization

实现就是实现定义的接口协议,通常使用implements关键字

    案例A

public interface WindowManager {
    void addView(View view, ViewGroup.LayoutParams params);
    void updateViewLayout(View view, ViewGroup.LayoutParams params);
    void removeView(View view);
}
public class WindowManagerImpl implements WindowManager {
    @Override
    public void addView(View view, ViewGroup.LayoutParams params) {
    }
    @Override
    public void updateViewLayout(View view, ViewGroup.LayoutParams params) {
    }
    @Override
    public void removeView(View view) {
    }
}

     * 就常见的的implements实现

    案例B

#IWindowManager.aidl
interface IWindowManager {
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);
}
public class WindowManagerService extends IWindowManager.Stub {
    @Override
    public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {
    }
}

* aidl特殊方式,实现接口使用的是extends关键字

2,继承:Inherritance

继承在Java中体现为 extends 实体类或抽象类

案例A

public class PhoneWindow extends Window {
    @Override
    public void setContentView(View view) {
        // TODO
    }
}
public abstract class Window {
    public abstract void setContentView(View view);
}

* 类(PhoneWindow),继承了另一个类(Window),可以实现定义的抽象方法或重写父类方法

3,依赖:Dependency

使用其它类的 常量或静态方法或作为局部变量使用

案例A

public class Client {
    public Client() {
        int defaultSize = ImageUtils.getDefaultSize();
    }
}
public class ImageUtils {
    public static int getDefaultSize() {
        return 640;
    }
}

* 类(Client),调用了另一个类(ImageUtils)的静态方法

案例B

public class MacbookBuilder {
    public Macbook create() {
        Macbook computer = new Macbook();
        computer.setBoard("英特尔主板");
        computer.setDisplay("Retina 显示器");
        computer.setOS();
        return computer;
    }
}
public class Macbook {
    private String mBoard;
    private String mDisplay;
    private String mOS;
	
    // 设置CPU核心数
    public void setBoard(String board) {
        this.mBoard = board;
    }
    // 设置内存
    public void setDisplay(String display) {
        this.mDisplay = display;
    }
    // 设置操作系统
    public void setOS() {
        mOS = "Mac OS X 10.10";
    }
}

* 类(MacbookBuilder),仅仅在某个函数调用了另一个类(Macbook)

4,引用:Association

引用表示,某个对象用到了一个其他对象的方法或属性。通常并不会在内部自己创建其他对象,而是传入的

案例A

public class WindowState {
    final IWindow mClient;
    public WindowState(IWindow c) {
        mClient = c;
    }
}
public interface IWindow {
    void executeCommand(String command);
}

* 类(WindowState),在构造方法中传入另一个类(IWindow),作为全局对象

案例B

public class WindowManagerImpl {
    private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance();
}
public class WindowManagerGlobal {
    private static WindowManagerGlobal sDefaultWindowManager;
    private WindowManagerGlobal() {
    }
    public static WindowManagerGlobal getInstance() {
        synchronized (WindowManagerGlobal.class) {
            if (sDefaultWindowManager == null) {
                sDefaultWindowManager = new WindowManagerGlobal();
            }
            return sDefaultWindowManager;
        }
    }
}

* 类(WindowManagerImpl),在定义全局参数时,间接获取其他类(WindowManagerGlobal)的对象

    案例C

public class WindowManagerGlobal {
    public static void getWindowManagerService() {
        WindowManagerService.getInstance();
    }
}
public class WindowManagerService {
    private static WindowManagerService sDefaultWindowManager;
    private WindowManagerService() {
    }
    public static WindowManagerService getInstance() {
        synchronized (WindowManagerService.class) {
            if (sDefaultWindowManager == null) {
                sDefaultWindowManager = new WindowManagerService();
            }
            return sDefaultWindowManager;
        }
    }
}

    * 类(WindowManagerGlobal),在调用某个函数的时候,引入其他类(WindowManagerService)

5,聚合:Aggregation

聚合也是引用的一种关系。它强调两个类之间的从属关系,但和组合不同,它不要求两个类的生命周期相同

案例A

public class TranfficCalculator {
    private Strategy mCaculateStrategy;
    public int caculatePrice(int km) {
        return this.mCaculateStrategy.calculatePrice(km);
    }
    public void setStrategy(Strategy strategy) {
        this.mCaculateStrategy = strategy;
    }
}
public class Strategy {
    int calculatePrice(int km) {
        return (int) (km * 0.01);
    }
}

      * 类(TranfficClculator),使用了另一个类(Strategy)作为一个组件。相对于组合而言,它和组件的生命周期不一致

6,组合:Composition

组合也是一种引用关系;它强调两个类之间整体和局部关系,并且暗示两个类之间有相同的生命周期

案例A

public class ViewRootImpl {
    final W mWindow;
    public ViewRootImpl() {
        mWindow = new W(this);
    }
    static class W {
        private final WeakReference<ViewRootImpl> mViewAncestor;
        W(ViewRootImpl viewRoot) {
            mViewAncestor = new WeakReference<>(viewRoot);
        }
    }
}

    * 总案例图中有:(ViewRootImpl + ViewRootImpl.W) 、 (PhoneView + PhoneView.DecorView)

    * 类(ViewRootImpl),使用它的内部类(ViewRootImpl.W);在构造方法中创建内部类的全局对象(mWindow)    

案例B

public class WindowManagerGlobal {
    private final ArrayList<ViewRootImpl> mRoots = new ArrayList<>();
    public void addView() {
        ViewRootImpl root = new ViewRootImpl();
        mRoots.add(root);
    }
    public void remoteView(int index) {
        mRoots.remove(index);
    }
    public void closeAll() {
        mRoots.clear();
    }
}
public class ViewRootImpl {
}

         * 总案例图中有:(WindowManagerGlobal + ViewRootImpl[列表]) 、 (WindowManagerService + WindowState[列表])

* 类(WindowManagerGlobal),默认创建外部类(ViewRootImpl)的列表,并在类中维护

案例C

public class Session {
    SurfaceSession mSurfaceSession;
    public Session() {
    }
    void windowAddedLocked() {
        if (mSurfaceSession == null) {
            mSurfaceSession = new SurfaceSession();
        }
    }
    void killSessionLocked() {
        if (mSurfaceSession != null) {
            mSurfaceSession = null;
        }
    }
}
public class SurfaceSession {
}

     *  总案例图中有:(Session + SurfaceSession) 、 (WindowManagerService + Session)

* 类(Session),持有SurfaceSession,并在内部实现创建和销毁,在类中维护