7.2 what
一个软件实体如果使用的是一个基类的话,那么一定适用于其子类,而且它根本不能觉察出基类对象和子类对象的区别。
反之不成立。

7.3 在设计模式中的体现
策略模式
合成模式
代理模式

7.5
长方形和正方形
Rectangle类的源代码:
 1package com.javapatterns.liskov.version1;
 2
 3public class Rectangle
 4{
 5    private long width;
 6    private long height;
 7    
 8    public void setWidth(long width)
 9    {
10        this.width = width;
11    }

12    public long getWidth()
13    {
14        return this.width;
15    }

16    public void setHeight(long height)
17    {
18        this.height = height;
19    }

20    public long getHeight()
21    {
22        return this.height;
23    }

24}

Square类的源代码:
 1package com.javapatterns.liskov.version1;
 2
 3public class Square
 4{
 5    private long side;
 6    
 7    public void setSide(long side)
 8    {
 9        this.side = side;
10    }

11
12    public long getSide()
13    {
14        return side;
15    }

16}

正方形不可以作为长方形的子类
新的Square类的源代码:
 1package com.javapatterns.liskov.version2;
 2
 3public class Square extends Rectangle
 4{
 5    private long side;
 6
 7    public void setWidth(long width)
 8    {
 9        setSide(width);
10    }

11
12    public long getWidth()
13    {
14        return getSide();
15    }

16
17    public void setHeight(long height)
18    {
19        setSide(height);
20    }

21
22    public long getHeight()
23    {
24        return getSide();
25    }

26
27    public long getSide()
28    {
29        return side;
30    }

31
32    public void setSide(long side)
33    {
34        this.side = side;
35    }

36}

SmartTest类的源代码:
 1package com.javapatterns.liskov.version2;
 2
 3public class SmartTest
 4{
 5    public void resize(Rectangle r)
 6    {
 7        while (r.getHeight() <= r.getWidth() )
 8        {
 9            r.setWidth(r.getWidth() + 1);
10        }

11    }

12
13    /** @link dependency */
14    /*#Rectangle lnkRectangle;*/
15}

代码的重构
Quadrangle类的源代码:
1package com.javapatterns.liskov.version3;
2
3public interface Quadrangle
4{
5    public long getWidth();
6
7    public long getHeight();
8}

Rectangle类的源代码:
 1package com.javapatterns.liskov.version3;
 2
 3public class Rectangle implements Quadrangle 
 4{
 5    private long width;
 6    private long height;
 7    
 8    public void setWidth(long width)
 9    {
10        this.width = width;
11    }

12    public long getWidth()
13    {
14        return this.width;
15    }

16    public void setHeight(long height)
17    {
18        this.height = height;
19    }

20    public long getHeight()
21    {
22        return this.height;
23    }

24}

Square类的源代码: 
 1package com.javapatterns.liskov.version3;
 2
 3public class Square implements Quadrangle 
 4{
 5    private long side;
 6
 7    public void setSide(long side)
 8    {
 9        this.side = side;
10    }

11
12    public long getSide()
13    {
14        return side;
15    }

16
17    public long getWidth()
18    {
19        return getSide();
20    }

21
22    public long getHeight()
23    {
24        return getSide();
25    }

26}


欢迎大家访问我的个人网站 萌萌的IT人