近期阅读了《大话设计模式》一书受益良多,特写此文以作笔记
本文将从如下三个方面开始讲述:
- 面向对象语言的三大特性
- 简易设计原则
设计模式分析
面向对象语言有三大特性:封装,继承,多态
封装是指将对象所应具有的行为进行包装,进而为对象内部和对象外部的调用提供统一规范的接口。例如:
/**
*
* @author yanjy
* @date 2017/10/16
*/
public class Dog {
private String name;
private int shoutTime = 6;
public Dog(String name, int shoutTimes) {
this.name = name;
this.shoutTime = shoutTimes;
}
public void shout() {
for (int i = 0; i < shoutTime; i++) {
System.out.println(name + ": 汪汪汪");
}
}
public static void main(String[] args) {
Dog dog = new Dog("小黑", 3);
dog.shout();
}
}
继承是一种is-a的关系,有两个对象A,B,如果可以描述为B是A,那么B可以继承A。例如:狗是哺乳动物。继承的特点是继承者拥有被继承的特性,同时还兼备自己独有的个性,在需要的时候还可以覆写被继承者特性的内部实现。可以说继承者是被继承的一个特例化。例如:
/**
*
* @author yanjy
* @date 2017/10/16
*/
public class Animal {
protected String name;
protected int shoutTimes;
}
/**
*
* @author yanjy
* @date 2017/10/16
*/
public class Dog extends Animal{
public Dog(String name, int shoutTimes) {
super.name = name;
super.shoutTimes = shoutTimes;
}
public void shout() {
for (int i = 0; i < shoutTimes; i++) {
System.out.println(name + ": 汪汪汪");
}
}
public static void main(String[] args) {
Dog dog = new Dog("小黑", 3);
dog.shout();
}
}
注:继承可以是子类之间进行代码共享,但向子类暴露了部分实现细节,加大了父子类之间的耦合度。建议当明确两个对象间是is-a关系再去使用。
多态是指不同的对象可以具有相同的行为,且要通过自己实现的代码来执行。多态的原理是当方法被调用时,无论对象是否转化成父类,都只有位于继承链最末端的方法实现会被调用。引用一句Brucee Eckel的话:“不要犯傻,如果它不是晚绑定,它就不是多态。”例如:重载就是静态绑定,在编译期间就已经确定了。
/**
*
* @author yanjy
* @date 2017/10/16
*/
public class Dog extends Animal{
public Dog(String name, int shoutTimes) {
super.name = name;
super.shoutTimes = shoutTimes;
}
@Override
public void shout() {
for (int i = 0; i < shoutTimes; i++) {
System.out.println(name + ": 汪汪汪");
}
}
public static void main(String[] args) {
Dog dog = new Dog("小黑", 3);
dog.shout();
}
}
/**
*
* @author yanjy
* @date 2017/10/16
*/
public class Cat extends Animal{
public Cat(String name, int shoutTimes) {
super.name = name;
super.shoutTimes = shoutTimes;
}
@Override
public void shout() {
for(int i = 0; i < shoutTimes; i++) {
System.out.println(name + ":喵喵喵");
}
}
}
import java.util.LinkedList;
import java.util.List;
/**
*
* @author yanjy
* @date 2017/10/16
*/
public class Client {
public static void main(String[] args) {
List<Animal> animals = new LinkedList<>();
animals.add(new Cat("喵喵", 3));
animals.add(new Dog("汪汪", 3));
animals.forEach(Animal::shout);
}
}
今晚先写到这里,以上均是鄙人愚见,如有错误,还望各位不吝赐教。