//抽象产品
abstract class Product {
//属性
private String type;//产品类型:比如产品A、产品B、产品C
protected Color color;//颜色:比如红、蓝、绿
//方法
public abstract void Operation();//上色方法
//get、set
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
}
②创建"抽象颜色"(本质是一个接口)
java复制代码
//抽象颜色
public interface Color {
//根据"产品的类型"上色,具体上什么颜色,由Color接口的具体实现类决定
public void OperationImp(String productType);
}
③创建两个具体的产品,比如产品A、产品B
java复制代码
public class ProductA extends Product{
@Override
//实现父类Product定义的抽象方法(在Product中,抽象方法没有方法体,所以在这里给出)
public void Operation() {
//调用上色方法
color.OperationImp(this.getType());//color继承自父类的属性color ,this代表ProductA的对象本身
}
}
java复制代码
public class ProductB extends Product{
@Override
//实现父类Product定义的抽象方法(在Product中,抽象方法没有方法体,所以在这里给出)
public void Operation() {
//调用上色方法
color.OperationImp(this.getType());//color继承自父类的属性color ,this代表ProductB的对象本身
}
}
④创建三个具体的颜色,比如红、蓝、绿
java复制代码
public class Red implements Color{
@Override
//实现接口Color中定义的上色方法
public void OperationImp(String productType) {
System.out.println("正在给"+productType+"涂上红色");
}
}
java复制代码
public class Blue implements Color{
@Override
//实现接口Color中定义的上色方法
public void OperationImp(String productType) {
System.out.println("正在给"+productType+"涂上蓝色");
}
}
java复制代码
public class Green implements Color{
@Override
//实现接口Color中定义的上色方法
public void OperationImp(String productType) {
System.out.println("正在给"+productType+"涂上绿色");
}
}
最终,进行测试
测试1:先来个红色的产品A
java复制代码
public class Demo01Application {
public static void main(String[] args) {
//目标:此时我想要一个红色的产品A
//1、创建一个具体的产品(比如产品A,即类型为A的产品)
ProductA productA = new ProductA();
//2、初始化产品的两个属性:产品类型、颜色(这是影响产品上色的两个因素)
productA.setType("产品A");
Color color = new Red();//这就是多态(说白了就是左边是通用的接口,右边是具体的实现类)
productA.setColor(color);
//3、执行上色方法
productA.Operation();
}
}
运行效果如下:
测试2:再来一个蓝色的产品B
java复制代码
public class Demo01Application {
public static void main(String[] args) {
//目标:此时我想要一个蓝色的产品B
//1、创建一个具体的产品(比如产品B,即类型为B的产品)
ProductB productB = new ProductB();
//2、初始化产品的两个属性:产品类型、颜色(这是影响产品上色的两个因素)
productB.setType("产品B");
Color color = new Blue();
productB.setColor(color);//这就是多态(说白了就是左边是通用的接口,右边是具体的实现类)
//3、执行上色方法
productB.Operation();
}
}
运行效果如下:
4.总结
颜色本身就是属于产品的一个属性,但是由于我们产品有很多类型,每个类型又有很多颜色。当我们的上色工艺,是由产品类型 + 颜色这两个因素决定的,此时我们就需要创建很多类(因为红色的产品A、红色的产品B、蓝色的产品C、绿色的产品D等等,它们的上色工艺都不同,所以只要产品类型 or 颜色 有一个不同,就需要定义一个专门的上色方法),因此此时就需要创建很多个类(因为是相乘关系,即产品类型数量 * 颜色数量)
左面的Color是接口,右边是Color接口的具体实现类。说白了就是父 = 子 ,这种就是多态的思想。也只有这样,我们才能把这个color塞到"抽象产品"中当做属性。你要是不用多态,而是Blue blue = new Blue(); 将blue塞到"抽象产品"中当做属性,会报错,因为"抽象产品"类中,属性定义的是Color接口。