如何做医疗网站的专题页,江西新农村建设权威网站,wordpress侧边栏标题字数,wordpress google seo文章目录 1 设计目标2 Java2.1 涉及知识点2.2 实现2.2.1 实现两个接口飞行为和叫行为2.2.2 实现Duck抽象基类#xff08;把行为接口作为类成员#xff09;2.2.3 实现接口飞行为和叫行为的具体行为2.2.4 具体实现鸭子2.2.5 模型调用 3 C#xff08;用到了大量C2.0的知识… 文章目录 1 设计目标2 Java2.1 涉及知识点2.2 实现2.2.1 实现两个接口飞行为和叫行为2.2.2 实现Duck抽象基类把行为接口作为类成员2.2.3 实现接口飞行为和叫行为的具体行为2.2.4 具体实现鸭子2.2.5 模型调用 3 C用到了大量C2.0的知识3.1 涉及知识点3.2 实现3.2.1 实现飞行为和叫行为接口3.2.2 实现Duck基类使用委托/组合把指向抽象接口类的指针作为类成员3.2.3 实现接口类的飞行为和叫行为3.2.4 实现具体的鸭子行为3.2.5 具体调用 4 Python实现4.1 涉及知识点4.2 实现代码4.2.1 实现两个接口飞行为和叫行为4.2.2 实现Duck抽象基类把行为接口作为类成员4.2.3 实现接口飞行为和叫行为的具体行为4.2.4 具体实现鸭子4.2.5 模型调用 5 完整代码6 其他知识阅读快速入门 1 设计目标
此篇为实现篇下如果对策略者模式不熟可以看知识点篇上。 实现要求鸭子共有三种行为游泳行为所有鸭子都会飞行行为能飞/不能飞/具有火箭动力的飞行叫声行为嘎嘎叫/吱吱叫/什么都不会叫不同具体鸭子绿头鸭/模型鸭/…飞行行为和叫声行为可能不一样。
2 Java
2.1 涉及知识点
接口interface定义一种方法约束继承extend子类会具有父类的一般特性也会具有自身的特性提高代码复用性。
区别
修饰符不同接口使用interface修饰继承使用extends修饰。
多继承方式不同接口支持多继承继承只支持单继承。
定义方式不同接口只能定义全局常量和抽象方法继承可以定义属性、方法、变量、常量等。
作用不同接口是一种约束类实现接口就一定要实现它所有的方法继承是一种扩展继承了类它的私有成员以外的成员变量和成员方法子类都将拥有。组合委托把A类作为B类的成员变量具体实现在A类中B类对外暴露调用接口解耦合。抽象基类不能实例化只能作为类模版子类需要实现起抽象方法。构造函数类的初始化方法。
2.2 实现
2.2.1 实现两个接口飞行为和叫行为
public interface FlyBehavior {public void fly();
}public interface QuackBehavior {public void quack();
}2.2.2 实现Duck抽象基类把行为接口作为类成员
package com.jiangxue.strategy;public abstract class Duck {//组合委托策略类作为抽象基类的成员变量QuackBehavior quackBehavior;FlyBehavior flyBehavior;//定义抽象方法子类必须要实现public abstract void display();//调用类成员的方法public void performQuack(){quackBehavior.quack();;}public void performFly(){flyBehavior.fly();}//所有子类都有的共有行为public void swim(){System.out.println(All ducks float, even decoys);}//setter方法设置鸭子行为运行时改变行为public void setFlyBehavior(FlyBehavior fb){flyBehavior fb;}public void setQuackBehavior(QuackBehavior quackBehavior) {this.quackBehavior quackBehavior;}
}2.2.3 实现接口飞行为和叫行为的具体行为
具体实现飞行为接口
public class FlyWithWings implements FlyBehavior{Overridepublic void fly(){System.out.println(Im flying);}
}public class FlyNoWay implements FlyBehavior{Overridepublic void fly() {System.out.println(I cant fly);}
}public class FlyRocketPowered implements FlyBehavior{Overridepublic void fly() {System.out.println(Im fly with rocket!);}
}具体实现叫行为接口
public class Quack implements QuackBehavior{Overridepublic void quack() {System.out.println(Quack);}
}public class MuteQuack implements QuackBehavior{Overridepublic void quack() {System.out.println(Silence);}
}public class Squeak implements QuackBehavior{Overridepublic void quack() {System.out.println(Squack);}
}
2.2.4 具体实现鸭子
实现绿头鸭
public class MallardDuck extends Duck{//重新构造函数public MallardDuck(){quackBehavior new Quack();flyBehavior new FlyWithWings();}public void display(){System.out.println(Im a real Mallard duck);}
}
实现模型鸭
public class ModelDuck extends Duck{public ModelDuck(){flyBehavior new FlyNoWay();quackBehavior new Quack();}Overridepublic void display() {System.out.println(Im a model duck);}
}
2.2.5 模型调用
public class Test {public static void main(String[] args) {//示例1Duck mallardDuck new MallardDuck();mallardDuck.performQuack();mallardDuck.performFly();//示例2Duck model new ModelDuck();model.performFly();//改变飞行行为model.setFlyBehavior(new FlyRocketPowered());model.performFly();; }
}3 C用到了大量C2.0的知识
3.1 涉及知识点
纯虚函数用于实现接口【virtua和 0】在基类中声明的虚函数它在基类中没有定义但要求任何派生类都要定义自己的实现方法。有纯虚函数的类是抽象类不能生成对象只能派生。virtual析构函数当父类指针指向子类对象时执行释放操作子类对象也会被释放掉。explicit该构造函数只能显式调用禁止隐式转换。右值引用结合了移动语义和完美转发可以绑定到临时对象。 移动语义不复制对象而只是让新的对象名指向原对象名所指对象并且将原对象所指的置空。完美转发可以撰写接受任意参数的函数模版并将其转发到其他函数目标函数会接受与其转发函数所接受的完全相同的参数。 std::move把实参强制转换为右值:无条件地右值类型的强制类型转换std::forward仅对绑定到右值的引用实施向右值类型的强制转换。 针对右值引用实施std::move万能引用实施std::forward 智能指针unique_ptr独占对象不允许复制动态管理分配对象的生命周期。make_unique函数动态分配指定类型的内存并返回一个指向分配内存的唯一指针。子类继承父类的构造不能直接从初始化列表初始化基类成员应该使用父类的构造函数。公有继承基类的公有成员和保护成员的访问属性在派生类中不变
3.2 实现
3.2.1 实现飞行为和叫行为接口
class QuackBehavior{
public://纯虚函数只有函数的名字而不具备函数的功能不能被调用要求任何派生类都要定义自己的实现方法//有纯虚函数的类是抽象类不能生成对象只能派生。virtual void quack() const 0;//virtual析构函数好处当父类指针指向子类对象时执行释放操作子类对象也会被释放掉virtual ~QuackBehavior() default;
};class FlyBehavior{
public:virtual void fly() const 0;virtual ~FlyBehavior() default;
};3.2.2 实现Duck基类使用委托/组合把指向抽象接口类的指针作为类成员
#include memory
#include FlyBehavior.h
#include QuackBehavior.h
#include iostreamclass Duck {
protected://智能指针unique_ptr独占对象不允许复制动态管理分配对象的生命周期std::unique_ptrFlyBehavior _flyBehavior;std::unique_ptrQuackBehavior _quackBehavior;
public://explicit表示该构造函数只能显式调用禁止隐式转换。/** 移动语义不复制对象而只是让新的对象名指向原对象名所指对象并且将原对象所指的置空。* 完美转发可以撰写接受任意参数的函数模版并将其转发到其他函数目标函数会接受与其转发函数所接受的完全相同的参数。* 右值引用结合了移动语义和完美转发可以绑定到临时对象。* std::move把实参强制转换为右值:无条件地右值类型的强制类型转换* std::forward仅对绑定到右值的引用实施向右值类型的强制转换。* 针对右值引用实施std::move万能引用实施std::forward*/explicit Duck(std::unique_ptrFlyBehavior flyBehavior {},std::unique_ptrQuackBehavior quackBehavior{}):_flyBehavior(std::move(flyBehavior)),_quackBehavior(std::move(quackBehavior)){}//上下文允许在运行时替换策略对象。void setFlyBehavior(std::unique_ptrFlyBehaviorflyBehavior){_flyBehavior std::move(flyBehavior);}void setQuackBehavior(std::unique_ptrQuackBehaviorquackBehavior){_quackBehavior std::move(quackBehavior);}//执行飞void performFly() const{_flyBehavior-fly();}//执行叫void performQuack() const{_quackBehavior-quack();}void swim() const{std::coutAll ducks float, even decoysstd::endl;}virtual void display() const 0;};3.2.3 实现接口类的飞行为和叫行为
实现飞行为
#include iostream
#include FlyBehavior.h//公有继承基类的公有成员和保护成员的访问属性在派生类中不变
class FlyWithWings: public FlyBehavior{
public:void fly() const override{std::coutIm flyingstd::endl;}
};class FlyNoWay: public FlyBehavior{
public:void fly() const override{std::coutI cant flystd::endl;}
};class FlyRocketPowered : public FlyBehavior{
public:void fly() const override{std::coutIm fly with rocket!std::endl;}
};
实现叫行为
#include QuackBehavior.h
#include iostreamclass Quack: public QuackBehavior{void quack() const override{std::coutquackstd::endl;}
};class MuteQuack : public QuackBehavior{
public:void quack() const override{std::coutSilencestd::endl;}
};class Squeak: public QuackBehavior{void quack() const override{std::coutSquackstd::endl;}
};3.2.4 实现具体的鸭子行为
绿头鸭
#include Duck.h
#include Quack.h
#include FlyWithWings.h
#include iostreamclass MallardDuck : public Duck{
public://子类继承父类的构造//不能直接从初始化列表初始化基类成员应该使用父类的构造函数explicit MallardDuck(std::unique_ptrFlyWithWings flyWithWings {},std::unique_ptrQuack quack{}): Duck(std::move(flyWithWings), std::move(quack)){}//虚函数方法重写void display() const override{std::coutIm a real Mallard duckstd::endl;}};模型鸭
#include Duck.h
#include FlyNoWay.h
#include Quack.hclass ModelDuck :public Duck{
public:explicit ModelDuck(std::unique_ptrFlyNoWay flyNoWay,std::unique_ptrQuack quack): Duck(std::move(flyNoWay), std::move(quack)){}void display() const override{std::coutIm a model duckstd::endl;}};3.2.5 具体调用
#include MallardDuck.h
#include ModelDuck.h
#include FlyRocketPowered.hvoid testCode() {//make_unique函数动态分配指定类型的内存并返回一个指向分配内存的唯一指针MallardDuck mallardDuck(std::make_uniqueFlyWithWings(),std::make_uniqueQuack());mallardDuck.performQuack();mallardDuck.performFly();ModelDuck modelDuck(std::make_uniqueFlyNoWay(),std::make_uniqueQuack());modelDuck.performFly();modelDuck.setFlyBehavior(std::make_uniqueFlyRocketPowered());modelDuck.performFly();}int main() {testCode();return 0;
}
4 Python实现
4.1 涉及知识点
抽象基类继承ABC不能被实例化只能被继承。抽象方法abstractmethod继承的子类必须实现的方法。属性propertyflyBehavior.setter调用时不需要加()为的是提供更加友好访问类数据的方式。构造函数def __init__初始化类成员变量。继承super().__init__继承父类的属性。from __future__ import annotations:允许你在程序中声明变量或函数的类型并由编译器或其他工具来检查代码的类型是否正确。有助于提高代码的可读性并且有助于发现类型错误。
4.2 实现代码
4.2.1 实现两个接口飞行为和叫行为
from abc import ABC, abstractmethod# 抽象基类
class FlyBehavior(ABC):# 抽象方法abstractmethoddef fly(self):passclass QuackBehavior(ABC):abstractmethoddef quack(self):pass4.2.2 实现Duck抽象基类把行为接口作为类成员
class Duck(ABC):def __init__(self, flyBehavior: FlyBehavior, quackBehavior: QuackBehavior) - None:self._flyBehavior flyBehaviorself._quackBehavior quackBehaviorabstractmethoddef perform(self) - None:passdef performFly(self) - None:return self._flyBehavior.fly()def performQuack(self) - None:return self._quackBehavior.quack()propertydef flyBehavior(self) - FlyBehavior:return self._flyBehaviorpropertydef quackBehavior(self) - QuackBehavior:return self._quackBehaviorflyBehavior.setterdef flyBehavior(self, fly: FlyBehavior) - None:self._flyBehavior flyquackBehavior.setterdef quackBehavior(self, quack: QuackBehavior) - None:self._quackBehavior quackdef swim(self) - None:print(All ducks float, even decoys)
4.2.3 实现接口飞行为和叫行为的具体行为
具体实现飞行为接口
class FlyWithWings(FlyBehavior):def fly(self) - None:print(Im flying)class FlyNoWay(FlyBehavior):def fly(self) - None:print(I cant fly)class FlyRocketPowered(FlyBehavior):def fly(self) - None:print(Im fly with rocket!)具体实现叫行为接口
class Quack(QuackBehavior):def quack(self) - None:print(Quack)class Square(QuackBehavior):def quack(self) - None:print(Squack)class MuteQuack(QuackBehavior):def quack(self) - None:print(Silence)4.2.4 具体实现鸭子
实现绿头鸭
class ModelDuck(Duck):def __init__(self, flyBehavior: FlyNoWay, quackBehavior: Quack) - None:super().__init__(flyBehavior, quackBehavior)# 下面的初始化方法并不能继承父类的属性# _flyBehavior flyBehavior# _quackBehavior quackBehaviordef perform(self) - None:print(Im a model duck)
实现模型鸭
class MallardDuck(Duck):def __int__(self, flyBehavior: FlyWithWings, quackBehavior: Quack) - None:super().__init__(flyBehavior, quackBehavior)def perform(self) - None:print(Im a real Mallard duck)
4.2.5 模型调用
# import sys , os
# base_dir os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# sys.path.append(base_dir)
# 没有把当前项目加入到PYTHONPATH环境变量from Strategy.duck import *if __name__ __main__:mallardDuck MallardDuck(FlyWithWings(), Quack())mallardDuck.performQuack()mallardDuck.performFly()modelDuck ModelDuck(FlyNoWay(), Quack())modelDuck.performFly()modelDuck.flyBehavior FlyRocketPowered()modelDuck.performFly()5 完整代码
完整的实现代码见Gitee仓库。如果对您有用的话欢迎留下star谢谢。
6 其他知识阅读快速入门
Java快速入门 Python快速入门 深入了解C2.0