pc端和移动端的网站区别是什么意思,天津做网站哪家公司好,镇江网站建设网站制作公司,注册公司在哪里注册PHP设计模式——行为型模式 PHP 设计模式中的行为模式#xff08;Behavioral Patterns#xff09;主要关注对象之间的通信和交互。行为模式的目的是在不暴露对象之间的具体通信细节的情况下#xff0c;定义对象的行为和职责。它们常用于解决对象如何协调工作的问题#xff…
PHP设计模式——行为型模式 PHP 设计模式中的行为模式Behavioral Patterns主要关注对象之间的通信和交互。行为模式的目的是在不暴露对象之间的具体通信细节的情况下定义对象的行为和职责。它们常用于解决对象如何协调工作的问题提高系统的灵活性、可扩展性和可维护性。 1、策略模式Strategy Pattern
概述 策略模式定义了一系列算法并将每个算法封装起来使他们可以互相替换该模式使得算法可以独立于使用它的客户端变化。也就是说测策略模式让一个类的行为可以在运行时被改变从而实现不同的业务逻辑。 结构 策略模式的结构通常包含以下几个组成部分 1、Context环境类 维护一个指向具体策略类的引用。 向客户端暴露一个公共的接口用于调用具体的策略行为 2、Strategy策略接口 定义一个统一的策略接口通常是一个抽象类或者接口所有具体策略类都实现这个接口包含算法的具体实现。 3、ConcreteStrategy具体策略类 实现策略接口中的算法 实例 以一个简单的支付系统为例假设用户可以选择不同的支付方式如支付宝、微信支付、信用卡支付等我们可以使用策略模式来实现。 // 策略接口
public interface PaymentStrategy {void pay(int amount);
}// 具体策略支付宝支付
public class AlipayStrategy implements PaymentStrategy {Overridepublic void pay(int amount) {System.out.println(使用支付宝支付 amount 元);}
}// 具体策略微信支付
public class WeChatPayStrategy implements PaymentStrategy {Overridepublic void pay(int amount) {System.out.println(使用微信支付 amount 元);}
}// 具体策略信用卡支付
public class CreditCardStrategy implements PaymentStrategy {Overridepublic void pay(int amount) {System.out.println(使用信用卡支付 amount 元);}
}// 上下文类
public class PaymentContext {private PaymentStrategy paymentStrategy;// 通过构造器或setter方法注入具体策略public PaymentContext(PaymentStrategy paymentStrategy) {this.paymentStrategy paymentStrategy;}// 执行支付public void executePayment(int amount) {paymentStrategy.pay(amount);}// 设置不同的支付策略public void setPaymentStrategy(PaymentStrategy paymentStrategy) {this.paymentStrategy paymentStrategy;}
}// 客户端代码
public class Client {public static void main(String[] args) {// 创建不同的支付策略PaymentStrategy alipay new AlipayStrategy();PaymentStrategy weChatPay new WeChatPayStrategy();PaymentStrategy creditCard new CreditCardStrategy();// 创建上下文选择支付方式PaymentContext context new PaymentContext(alipay);context.executePayment(100);// 改变支付策略context.setPaymentStrategy(weChatPay);context.executePayment(200);context.setPaymentStrategy(creditCard);context.executePayment(300);}
}
运行结果
使用支付宝支付 100 元
使用微信支付 200 元
使用信用卡支付 300 元适用场景 多种算法或行系统有多种算法或行为可供选择并且算法都是动态的。 避免条件语句在系统中有大量的条件语句if…else…或者switch…case来选择算法使用策略模式可以代替这些条件语句使得代码更加清晰和灵活。 算法经常变化如果算法经常变化使用策略模式能够使得新增或修改算法变得更加容易而不需要修改使用算法的客户端代码 变种与扩展 StatePattern状态模式状态模式和策略模式很相似都是行为型设计模式都会根据某些条件改变行为。它们的不同点在于策略模式通常关注算法的选择而状态模式关注的是对象的状态。 Template MethodPattern模板方法模式模板方法模式定义了算法的框架并将一些步骤延迟到子类中策略模式则是通过策略接口提供算法的替代方案。 小结 策略模式是为了让客户端能够在运行时选择合适的算法而不需要修改具体的类实现了算法的封装和解耦。通过定义统一的策略接口将不同的算法封装到不同的策略类中增强了系统的灵活性和可扩展性。 优点 算法封装策略模式将每个算法封装到独立的策略类中可以避免使用大量的条件判断提升代码的可维护性和扩展性 可以动态切换客户端可以在运行时切换不同的策略不必在编译时就确定 缺点 增加类的数量为了实现策略模式往往需要为每个具体的策略都创建一个类这可能导致类的数量增加增加了系统的复杂性 客户端需要知道所有的策略客户端必须了解所i有的可用的策略这会导致客户端代码对具体策略的依赖性比较强 2、观察者模式Observer Pattern
概述 是一种行为设计模式定义了对象之间的一种一对多依赖关系。当一个对象的状态发生变化时所有依赖于它的对象都会自动得到通知并更新。这种模式常用于实现分布式事件处理系统。 结构 观察者模式主要有以下几个组成部分 Subject主题/被观察者 1、主题对象是被观察的对象它通常是状态变化的源头。 2、主题对象维护一个观察者列表当状态变化时会通知所有观察者 Observer观察者 1、观察者对象关注主题对象的状态变化并在状态变化时进行相应的处理 2、观察者接口通常会定义一个update的方法当被观察者状态变化时update方法会被调用 ConcreteSubject具体主题/具体被观察者 1、具体的被观察者它实现Subject接口管理观察者列表并在状态发生变化时通知所有注册的观察者 ConcreteObserver具体观察者 1、具体的观察者继承自Observer接口实现update方法处理观察者状态变化时的响应 示例
?php?php// 观察者接口
interface Observer {public function update($news);
}// 主题接口
interface Subject {public function registerObserver(Observer $observer);public function removeObserver(Observer $observer);public function notifyObservers();
}// 具体的主题类
class NewsAgency implements Subject {private $observers [];private $news;// 注册观察者public function registerObserver(Observer $observer) {$this-observers[] $observer;}// 移除观察者public function removeObserver(Observer $observer) {$index array_search($observer, $this-observers);if ($index ! false) {unset($this-observers[$index]);}}// 通知所有观察者public function notifyObservers() {foreach ($this-observers as $observer) {$observer-update($this-news);}}// 设置新闻并通知观察者public function setNews($news) {$this-news $news;$this-notifyObservers(); // 发布新闻时通知所有观察者}
}// 具体的观察者类
class User implements Observer {private $name;public function __construct($name) {$this-name $name;}public function update($news) {echo $this-name . 收到新闻更新: . $news . PHP_EOL;}
}// 客户端代码
$newsAgency new NewsAgency();// 创建具体的观察者用户
$user1 new User(Alice);
$user2 new User(Bob);
$user3 new User(Charlie);// 注册观察者
$newsAgency-registerObserver($user1);
$newsAgency-registerObserver($user2);
$newsAgency-registerObserver($user3);// 发布新闻
$newsAgency-setNews(今天的新闻头条PHP 设计模式);// 移除观察者
$newsAgency-removeObserver($user2);// 发布新新闻
$newsAgency-setNews(今天的新闻头条观察者模式在PHP中的实现);?
运行结果
Alice 收到新闻更新: 今天的新闻头条PHP 设计模式
Bob 收到新闻更新: 今天的新闻头条PHP 设计模式
Charlie 收到新闻更新: 今天的新闻头条PHP 设计模式
Alice 收到新闻更新: 今天的新闻头条观察者模式在PHP中的实现
Charlie 收到新闻更新: 今天的新闻头条观察者模式在PHP中的实现适用场景 观察者模式适用于以下情况 事件驱动系统例如点击事件、输入框变化事件等。 消息推送系统如新闻推送、天气更新推送等。 实时数据监控系统比如股票行情、体育比赛数据的实时更新。 GUI框架如按钮点击、窗口变化等事件处理。 变种与扩展 推模型与拉模型 推模型主题对象将更新的内容主动推送给观察者。例如主题直接将新闻内容传递给观察者。 拉模型观察者通过主题对象拉取更新内容。例如观察者请求最新的新闻内容而不是由主题主动推送。 发布-订阅模式Pub-Sub 发布-订阅模式是一种广泛使用的观察者模式变种常常结合消息队列或事件总线。它不仅可以将事件通知从发布者传递给订阅者还支持消息过滤、延迟通知等功能。 小结 观察者模式是一种非常实用的设计模式适用于需要多个对象响应某个对象状态变化的场景。通过解耦对象之间的关系它使得系统更加灵活和可扩展。虽然在某些复杂系统中可能会引入性能或管理上的挑战但其简单和直观的实现方式使得它在很多场合得到了广泛应用。在 PHP 中实现观察者模式相对简单能够帮助开发者构建高效、灵活的事件驱动系统。 优点 解耦观察者模式让主题和观察者之间不直接依赖主题不知道观察者的具体类观察者也不知道主题的具体内容二者只通过接口进行交互。这样系统更加灵活可扩展性强。 动态更新观察者模式使得系统能够在运行时动态添加或移除观察者无需修改主题类或已有的观察者类。 多播通信一个主题可以同时通知多个观察者适合于广播式的事件处理如推送通知、实时消息更新等。 缺点 可能导致内存泄漏如果观察者没有及时取消订阅可能会导致主题无法被垃圾回收从而造成内存泄漏。 依赖链复杂在某些复杂系统中观察者之间可能会互相依赖从而形成复杂的依赖关系增加系统的复杂度。 通知开销如果观察者数量很多每次通知可能需要遍历所有观察者影响性能。