六大原则与设计模式

news/2024/4/27 14:28:45/文章来源:https://blog.csdn.net/fengfeiyeqi/article/details/137053094

1. 六大原则

1.1 单一原则(SRP)

应该有且仅有一个原因引起类的变更

1. 复杂性降低,可读性高,可维护性提高

2. 变更引起的风险降低,变更是必不可少的,如果接口的单一职责做得好,一个接口修改只对相应的实现类有影响,对其他的接口无影响,这对系统的扩展性、维护性都有非常大的帮助。

class a{public function info(){echo "第一条消息";}
}
class b{public function text(){echo "第二条消息";}
}
class c {public function run(){$a = new a();$a->info();$b = new b();$b->text();}
}
$c = new c();
$c->run();
1.2 开闭原则

类应该对扩展开放,对修改关闭

interface A{public function boot();
}class B implements A{public function boot(){return rand(1,100);}
}class cli{public function run(){$b= new B();return $b->boot();}
}
$cli = new cli();
echo $cli->run();
1.3 里氏替换原则

子类必须能够替换掉它们的基类

class A{public function a(){return "电子产品";}
}
class B extends A{public function a(){return "手机";}
}
class client
{public function run(){$b = new B();echo $b->a();}
}
$client = new client();
$client->run();
1.4 依赖倒置原则

高层模块不应该依赖于低层模块,它们都应该依赖于抽象。

interface A{public function str();
}class B implements A{public function str(){return rand(1,100);}
}
class C implements A{public function str(){return "123";}
}
1.5 接口隔离原则 (ISP)   

类不应该依赖于它不需要的接口

interface A{public function a();public function b();
}
class B implements A{public function a(){return "a";}public function b(){return "b";}
}

1.6 迪米特法则

优先使用对象组合而不是类继承

class a{protected  $user;public  function __construct(\think\App $app){$this->user=$app;}public function index($id){return $this->user->index($id);}
}

这些原则有助于写出高内聚、低耦合的代码,使得代码更易于维护和扩展。

2. 设计模式

2.1 结构型模式
2.1.1 装饰器模式

装饰器模式用于动态地将新的行为添加到对象上,对于需要扩展功能的类来说是一种更加灵活的设计方案。在PHP中,可以使用装饰器模式来为已有的对象添加新的行为,不需要修改已有类的代码。

装饰器的优点:

1. 不改变代码的情况下对原代码的功能职责进行扩展,遵守了开闭原则

2. 每个类都有属于自己的功能职责

interface MobileCase
{public function boot();
}class Mobile implements MobileCase
{public function boot(){echo "无色无图案手机壳".PHP_EOL;}
}abstract class MobileDecorator implements MobileCase
{protected $mobileCase;public function __construct(MobileCase $mobileCase){$this->mobileCase = $mobileCase;}public function boot(){$this->mobileCase->boot();}
}class HedMobileCase extends MobileDecorator
{private $name = "红色手机壳";private function add(){echo $this->name.PHP_EOL;}public function boot(){$this->mobileCase->boot();$this->add();}
}class GreenMobileCase extends MobileDecorator
{private $name = "黄色手机壳";private function add(){echo $this->name.PHP_EOL;}public function boot(){$this->mobileCase->boot();$this->add();}
}class client
{public function run(){$MobileCase = new Mobile();$HedMobileCase = new HedMobileCase($MobileCase);$HedMobileCase->boot();}
}$client = new client();
$client->run();
2.1.2 facade门面模式

又称为外观模式,为子系统中的一组接口提供一个统一的高层接口, 使得子系统更容易使用

门面模式的组成:

1. 外观角色 :模式的核心,被客户 Client 调用,知道各个子系统的概念。

2. 子系统角色 :实现子系统的功能。

3. 客户角色 :调用 Facade 角色获取相应的功能。

门面模式的优缺点:

1. 降低系统的复杂程度 2. 低耦合 3. 使用简单 4. 可能违背开闭原则

class Connection
{private function conn(){try {$connection = new PDO('mysql:host=127.0.0.1;dbname=starsky','root','root');return $connection;}catch (PDOException $exception){echo $exception->getMessage();}}public function run(){return $this->conn();}
}
class DBQuery
{public function query(Connection $connection,$sql){try {$pdo = $connection->run();$restful = $pdo->query($sql)->fetchAll();return $restful;}catch (PDOException $exception){echo $exception->getMessage();}}
}
class facade
{private $query;private $conn;public function __construct(){$this->query = new DBQuery();$this->conn = new Connection();}public function select($sql){return $this->query->query($this->conn,$sql);}
}
class DB
{private static $query;public static function select($sql){static::$query = new facade();return self::$query->select($sql);}
}
var_dump(DB::select('select * from `user`'));
2.1.3 注册树模式

通过将对象实例注册到一棵全局的对象树上,需要的时候从对 象树上采摘的模式设计方法

1. Laravel框架的服务容器          2. Thinkphp框架


class Container
{private $bindings = [];public function bind($abstract, $concrete = null, $shared = false){$this->bindings[$abstract]['concrete'] = $concrete;$this->bindings[$abstract]['shared'] = $shared;}public function make($abstract,$parameters = []){$object = $this->bindings[$abstract]['concrete'];if ($object instanceof \Closure){return $object();}if (!is_object($object)){$object = new $object(...$parameters);}return  $object;}public function delete($abstract){unset($this->bindings[$abstract]);}
}
class A
{public function run(){echo "这里是A类的run方法";}
}$container = new Container();
$container->bind('a',new A());
$container->make('a')->run();class Container
{//用于存储实例化的对象或者类的命名空间private $bindings = [];//注册对象到$bindings数组里面,进行存储public function bind($abstract, $concrete = null){$this->bindings[$abstract] = $concrete;}
}
class A{}
$container = new Container();
$container->bind('A',new A());
interface I
{public function boot();
}
/*** Class A php项目生成的数据 => 给java语言接口*/
class A implements I
{public function boot(){$data = ["id" =>1,"name" => "starsky"];return json_encode($data);}
}/*** Class B java生成的数据 =>php语言接口*/
class B implements I
{public function boot(){$data = ["id" =>1,"name" => "starsky"];return serialize($data);}
}interface I_Apadtor
{public function boot(I $i);
}class Apadtor implements I_Apadtor
{public function boot(I $i){if (!is_null($string = json_decode($i->boot()))){return serialize($string);}else{$string = unserialize($i->boot());return json_encode($string);}}
}
$Apadtor = new Apadtor();
//java端调用php端数据
var_dump("java调用php的数据:".$Apadtor->boot(new A()));
//php端调用java端数据
var_dump("php调用java的数据:".$Apadtor->boot(new B()));

2.1.4 适配器模式

将一个类的接口,转换成客户期望的另一个类的接口。适配器让原 本接口不兼容的类可以合作无间。

interface I
{public function boot();
}class A implements I
{public function boot(){$data = ["name" => "starsky","age" => 100,"sex" => 1];return serialize($data);}
}class B implements I
{public function boot(){$data = ["name" => "starsky","age" => 100,"sex" => 1];return json_encode($data);}
}interface I_Adaptor
{public function boot(I $i);
}class Adaptor implements I_Adaptor
{public function boot(I $in){if (!is_null($string = json_decode($in->boot()))){return serialize($string);}else{$string = unserialize($in->boot());return  json_encode($string);}}
}$Adaptor = new Adaptor();
var_dump(json_decode($Adaptor->boot((new A()))));
var_dump(unserialize($Adaptor->boot((new B ()))));
2.1.5 Pipeline模式

应用场景: 1.订单生成 2.Laravel中中间件的执行

class A
{public static function handle($request){echo "这里A类的Boot方法".PHP_EOL;}
}
class B
{public static function handle($request){echo "这里是B类的Boot方法".PHP_EOL;}
}
class C
{public static function handle($request){echo "这里是C类的Index方法".PHP_EOL;}
}
class D
{public function index(){echo "这里是D类的index方法";}
}
interface PipelineInterface
{public function pipe($middleware);public function then();
}
class Pipeline implements PipelineInterface
{protected $Middleware = [];protected $request;public function __construct($object,$method,$argv = []){$this->request['object'] = $object;$this->request['method'] = $method;$this->request['argv'] = $argv;}public function pipe($middleware){$this->Middleware = $middleware;return $this;}public function then(){foreach ($this->Middleware as $value){call_user_func([$value,'handle'],$this->request);}return $this;}public function send(){$method = $this->request['method'];return $this->request['object']->$method(...$this->request['argv']);}
}
class Kernel
{protected $Middleware = [];public function handle(Pipeline $pipeline){return $pipeline->pipe($this->Middleware)->then()->send();}
}
class Http extends Kernel
{protected $Middleware=[A::class,B::class,C::class];
}
$httpKernel = (new Http())->handle(new Pipeline(new D(),'index'));

2.1.6 代理模式

给某一个对象提供一个代理,并由代理对象控制对原对象的引用

interface I
{public function boot();public function handle();
}class A implements I
{public function boot(){echo "A类的boot方法".PHP_EOL;}public function handle(){echo "A类的handle方法".PHP_EOL;}
}class Proxy implements I
{protected $A;public function __construct(I $i){$this->A = $i;}public function boot(){$this->A->boot();}public function handle(){$this->A->handle();}
}$Proxy = new Proxy(new A());
$Proxy->boot();
$Proxy->handle();
2.2 创建型模式
2.2.1 简单工厂模式

简单工厂的作用是实例化对象,而不需要客户了解这个对象属于哪个具体的子类。

//mysql报错日志
class MysqlLog
{
}
//Redis报错日志
class RedisLog
{
}
//用户操作错误日志
class UserLog
{
}
//代码错诶日志
class ErrorLog
{
}class Product
{protected $Log;public function __construct(array $modules){$factory = new LogFactory();foreach ($modules as $module){$this->Log[$module] = $factory->make($module);}}public function getLog(){return $this->Log;}
}class LogFactory
{public function make($abstract){switch ($abstract){case 'mysql':return new MysqlLog();case 'redis':return new RedisLog();case 'user':return new UserLog();case 'error':return new ErrorLog();}}
}$Product = new Product(array('mysql','redis','user','error'
));
var_dump($Product->getLog());
2.2.2 Factory工厂模式

简单工厂模式的延伸,是在简单工厂的优点上去解决它的缺陷 

方法工厂模式的优点: 1.拥有良好的封装性,代码结构清晰 2. 拥有良好的扩展性 3. 屏蔽产品类

使用场景: 1. 日志记录 2. 多接口支付 3. 数据库连接封装

interface LogInterface
{public function log();
}
//mysql报错日志
class MysqlLog implements LogInterface
{public function log(){// TODO: Implement log() method.}
}
//Redis报错日志
class RedisLog implements LogInterface
{public function log(){// TODO: Implement log() method.}
}
//用户操作错误日志
class UserLog implements LogInterface
{public function log(){// TODO: Implement log() method.}
}
//代码错诶日志
class ErrorLog implements LogInterface
{public function log(){// TODO: Implement log() method.}
}class Product
{protected $Log;public function __construct(){$this->Log = array((new MysqlLogFactory())->make(),(new RedisLogFactory())->make(),(new UserLogFactory())->make(),(new ErrorLogFactory())->make());}public function getLog(){return $this->Log;}
}interface LogFactory
{public function make();
}class MysqlLogFactory implements LogFactory
{public function make(){return new MysqlLog();}
}
class RedisLogFactory implements LogFactory
{public function make(){return new RedisLog();}
}
class UserLogFactory implements LogFactory
{public function make(){return new UserLog();}
}class ErrorLogFactory implements LogFactory
{public function make(){return new ErrorLog();}
}
$product = new Product();
var_dump($product->getLog());
2.2.3 抽象工厂模式

给客户端提供一个接口,可以创建多个产品族中的产品对象 

抽象工厂模式的优缺点: 1. 分离了具体的实现类 2. 增加替换工厂类目变的方便 3. 有利于统一同一类型的类目

interface PayInterface
{public function pay();
}class AliPay implements PayInterface
{public function pay(){return "支付宝支付";}
}class TenPay implements PayInterface
{public function pay(){return "微信支付";}
}interface LogInterface
{public function log();
}class MysqlLog implements LogInterface
{public function log(){return "记录mysql日志";}
}class RedisLog implements LogInterface
{public function log(){return "记录Redis日志";}
}interface PayFactoryInterface
{public function AliPayMake();public function TenPayMake();
}interface LogFactoryInterface
{public function MysqlLogMake();public function RedisLogMake();
}class PayFactory implements PayFactoryInterface
{public function AliPayMake(){return new AliPay();}public function TenPayMake(){return new TenPay();}
}class LogFactory implements LogFactoryInterface
{public function MysqlLogMake(){return new MysqlLog();}public function RedisLogMake(){return new RedisLog();}
}class Order
{protected $log;protected $pay;public function __construct(){$LogFactory = new LogFactory();$PayFactory = new PayFactory();$this->log = array('mysql' => $LogFactory->MysqlLogMake(),'redis' => $LogFactory->RedisLogMake());$this->pay = array('Ali' => $PayFactory->AliPayMake(),'Ten' => $PayFactory->TenPayMake());}public function getLog(){return $this->log;}public function getPay(){return $this->pay;}
}$order = new Order();
var_dump($order->getLog());
var_dump($order->getPay());
2.2.4 Single单例模式

保证一个类只有一个实例,并提供一个访问它的全局访问点

使用场景: 1. 数据库连接 2. 日志操作类 3. 请求管理类 4. 配置管理类

class Request
{private static $request;protected $method;protected $uriPath;private function __construct(){}private function __clone(){}public static function getRequest(){if (self::$request == null){self::$request = new Request();}self::$request->method = $_SERVER['REQUEST_METHOD'];self::$request->uriPath= $_SERVER['REQUEST_URI'];return self::$request;}public function getMethod(){return $this->method;}public function getUriPath(){return $this->uriPath;}public function isMethod($method):bool{return $this->method === strtoupper($method);}
}
$request = Request::getRequest();
var_dump($request->isMethod('get'));
2.3 行为型模式
2.3.1 策略模式

定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换

策略模式使用的业务场景: 1. 短语发送 2. 多支付接口 3. 日志记录  

interface PayInterface
{public function pay();
}
class AliPay implements PayInterface
{public function pay(){echo "支付宝支付";}
}
class TenPay implements PayInterface
{public function pay(){echo "微信支付";}
}
class Pay
{protected $pay;public function __construct(PayInterface $pay){$this->pay = $pay;}public function getPay(){return $this->pay;}
}
$pay = new Pay(new AliPay());
$pay->getPay()->pay();
2.3.2 Observe观察者模式

多个对象间存在一对多的依赖关系,当一个对象的状态 发生改变时,所有依赖于它的对象都得到通知并被自动更新

观察者模式的使用场景: 1. 订单支付场景 2. 发布订阅类型的功能

观察者模式的优点: 1. 观察者与被观察者依赖于抽象 2. 观察者符合开闭原则,只要符合接口,就能够进行扩展

观察者模式的缺点: 1. 依赖于接口的关系,具备一定的局限性 2. 过多的观察者,代码运行消耗可能会很大

interface OrderPayInterface
{public function PayEvent($OrderId = null);
}class OrderPay implements OrderPayInterface
{public function PayEvent($OrderId = null){echo "订单ID为:{$OrderId}的订单状态为已支付".PHP_EOL;}
}
abstract class OrderEventAbstract
{private $Observer;public function register(OrderPayInterface $pay){$this->Observer = $pay;}public function notify($OrderId){$this->Observer->PayEvent($OrderId);}
}
class Order extends OrderEventAbstract
{public function pay($OrderId){echo "支付成功".PHP_EOL;$this->notify($OrderId);}
}
$order = new Order();
$order->register(new OrderPay());
$order->pay(1);
2.3.3 命令链模式

以松散耦合主题为基础,发送消息、命令和请求,或通过一组处理 程序发送任意内容

命令链模式的应用场景: 1. 登录注册不同角色的业务操作 2. 直播间不同等级会员业务 3. 订单支付状态

interface CommandInterface
{public function runCommand($name,$argv);
}
class CreateControllerCommand implements CommandInterface
{public function runCommand($name, $argv){echo "创建控制器".PHP_EOL;}
}
class CreateModelCommand implements CommandInterface
{public function runCommand($name, $argv){echo "创建模型".PHP_EOL;}
}
class Command
{private $command = [];public function register(array $command){$this->command = $command;}public function run($name,$argv){foreach ($this->command as $key=>$value){if ($name == $key){return $value->runCommand($name,$argv);}}}
}
$command = new Command();
$command->register(array('controller' => new CreateControllerCommand(),'model' => new CreateModelCommand()
));
$command->run('model',1);
interface RoleLoginInterface
{public function handle($name);
}class bronze implements RoleLoginInterface
{public function handle($name){echo "欢迎{$name}进入直播间".PHP_EOL;}
}class silver implements RoleLoginInterface
{public function handle($name){echo "欢迎白银会员{$name}进入直播间".PHP_EOL;}
}class gold implements RoleLoginInterface
{public function handle($name){echo "欢迎黄金大神{$name}进入直播间,此时有掌声与音乐".PHP_EOL;}
}class Role
{private $role = [];public function register(array $role){$this->role = $role;}public function LoginEvent($name,$role){foreach ($this->role as $key => $value){if ($role == $key){return $value->handle($name);}}}
}
$role = new Role();
$role->register(array('bronze' => new bronze(),'silver' => new silver(),'gold'   => new gold()
));
$role->LoginEvent('harry','bronze');
$role->LoginEvent('xx','gold');
$role->LoginEvent('lori','silver');
2.3.4 迭代器模式

提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该 对象的内部显示

迭代器模式的角色: 1. 迭代器:迭代器定义访问和遍历元素的接口 2. 具体迭代器: 实现迭代器接口,对该聚合遍历时跟踪当前位置 3. 聚合: 聚合实现创建相应迭代器的接口,这个操作是返回具体迭代器的实例

迭代器的优点: 1.多种遍历方式 2.简化聚合类 3.为不同的集合提供统一的接口

迭代器的缺点: 迭代器模式将存储数据和遍历数据的职责分离增加新的集合对象时需要增加 对应的迭代器类,类的个数成对增加,在一定程度上增加系统复杂度

使用场景: 1.访问一个聚合对象的内容而无需暴露它的内部表示 2.支持对聚合对象的多种遍历 3.为遍历不同的聚合结构提供一个统一的接口

class CycleIterator implements Iterator
{private $array = [];private $currentIndex = 0;public function __construct($array){$this->array = $array;}public function current(){return $this->array[$this->currentIndex];}public function setCurrentIndex($currentIndex){$this->currentIndex = $currentIndex;}public function setArray($array){$this->array = $array;}public function getCurrentIndex(){return $this->currentIndex;}public function getArray(){return $this->array;}public function key(){return $this->currentIndex;}public function next(){++$this->currentIndex;}public function rewind(){$this->currentIndex = 0;}public function valid(){return isset($this->array[$this->currentIndex]);}
}class Cycle implements IteratorAggregate
{protected $array;public function __construct($array){$this->array = $array;}public function getIterator(){return new CycleIterator($this->array);}
}
$list = [1,2,3,4,5,6,7,8,9];
$cycle= new CycleIterator($list);
foreach ($cycle as $value){echo $value.PHP_EOL;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1026438.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于单片机多功能智能台灯设计

**单片机设计介绍,基于单片机多功能智能台灯设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的多功能智能台灯设计是一个集硬件与软件于一体的综合性项目,旨在为用户提供更加便捷、舒适和节…

如何借用 NTFS 交换数据流 实现隐藏文件?如何使用【文件包含】PHP伪协议?不同操作系统如何实现文件隐藏和木马伪装?

如何借用 NTFS 交换数据流 实现隐藏文件?如何使用【文件包含】PHP伪协议?不同操作系统如何实现文件隐藏和木马伪装? NTFS交换数据流(Alternate Data Streams, ADS)是NTFS文件系统特有的一种功能,它允许在同一个文件名下存储多个数据流。除了默认的数据流(通常用于存储文…

day3-QT

1>使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函。将登录按钮使用qt5版本的连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"admin",密码是…

Java SPI 机制

SPI 机制的定义 在Java中,SPI(Service Provider Interface)机制是一种用于实现软件组件之间松耦合的方式。它允许在应用程序中定义服务接口,并通过在类路径中发现和加载提供该服务的实现来扩展应用程序功能。 SPI 机制通常涉及三…

DBA工作经验总结

目录 一、MySQL8.0创建一张规范的表 1.表、字段全采用小写 2.int类型不再加上最大显示宽度 3.每张表必须显式定义自增int类型的主键 4.建表时增加comment来描述字段和表的含义(防止以后忘记) 5.建议包含create_time和update_time字段 6.核心业务增…

asp程序之“会话Cookie中缺少HttpOnly属性”

先在URL重新模块添加服务器变量&#xff1a; 添加变量名&#xff1a;Add HttpOnly 网站根目录web.config添加如下规则&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <configuration><system.webServer><rewrite><out…

第1篇:Mysql数据库表结构导出字段到Excel(一个sheet中)

package com.xx.util;import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.sql.*; import java.io.*;public class DatabaseToExcel {public static void main(String[] args) throws Exception {// 数据库连接配置String u…

SQLyog图形化工具安装教程

日常开发中&#xff0c;当需要输入的命令较长时&#xff0c;使用命令行客户端工具输入命令很不方便&#xff0c;此时可以使用相对方便的图形化管理工具来操作MySQL&#xff0c;从而提高效率。 SQLyog的特点 1.基于MySQL程序接口开发 2.方便快捷的数据库同步与数据库结构同步 …

【检索稳定|火爆征稿中】2024年企业管理与数字化经济国际学术会议(ICBMDE 2024)

【检索稳定|火爆征稿中】2024年企业管理与数字化经济国际学术会议&#xff08;ICBMDE 2024&#xff09; 2024 International Conference on Business Management and Digital Economy&#xff08;ICBMDE 2024&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~…

【算法刷题】链表笔试题解析(1)

一、链表分割 题目描述&#xff1a; 链接&#xff1a;链表分割 题目分析&#xff1a; 这题直接处理并不好做&#xff0c;我们可以构建前后两个链表&#xff0c;将小于x值的结点放在链表a内&#xff0c;将其它结点放在链表b内&#xff0c;这样将原链表遍历完后&#xff0c;原链…

基于springboot+vue+Mysql的闲一品交易平台

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

缓存菜品、套餐、购物车相关功能

一、缓存菜品 通过缓存的方式提高查询性能 1.1问题说明 大量的用户访问导致数据库访问压力增大&#xff0c;造成系统响应慢&#xff0c;用户体验差 1.2 实现思路 优先查询缓存&#xff0c;如果缓存没有再去查询数据库&#xff0c;然后载入缓存 将菜品集合序列化后缓存入red…

如何利用nginx在windows系统上搭建一个文件服务器

1&#xff1a;先下载windows版的nginx 官网 http://nginx.org/ 下载完后注意端口号&#xff08;默认端口号为&#xff1a;80&#xff09;是否被占用 启动nginx服务 地址为localhost的 如果出现 Welcome to nginx 就说明启动成功 2&#xff1a;然后进入conf文件里修改配置 …

题目:摆花(蓝桥OJ 0389)

问题描述&#xff1a; 题解&#xff1a; #include <bits/stdc.h> using namespace std; using ll long long; const int N 105; const ll p 1e6 7; ll a[N], dp[N][N];int main() {int n, m; cin >> n >> m;for(int i 1; i < n; i)cin >> a[i…

EdgeGallery开发指南

API接口 简介 EdgeGallery支持第三方业务系统通过北向接口网关调用EdgeGallery的业务接口。调用流程如下图所示&#xff08;融合前端edgegallery-fe包含融合前端界面以及北向接口网关功能&#xff0c;通过浏览器访问时打开的是融合前端的界面&#xff0c;通过IP:Port/urlPref…

网络原理(6)——IP协议

目录 一、网段划分 现在的网络划分&#xff1a; 1、一般情况下的家庭网络环境 2、IP地址 3、子网掩码 4、网关 以前的网络划分&#xff1a; 二、特殊IP 1、环回 IP 2、主机号为全 0 的IP 3、广播地址IP 三、路由选择&#xff08;路线规划&#xff09; 一、网段划分…

vue3+ts+element home页面侧边栏+头部组件+路由组件组合页面教程

文章目录 效果展示template代码script代码样式代码 效果展示 template代码 <template><el-container class"home"><el-aside class"flex" :style"{ width: asideDisplay ? 70px : 290px }"><div class"aside-left&q…

KubeSphere简单介绍及安装使用

KubeSphere 概述 官网地址&#xff1a;https://kubesphere.io/zh/ 什么是 kubesphere KubeSphere 是一个开源的多云容器管理平台&#xff0c;旨在简化企业级 k8s 集群的部署、管理和运维。它提供了一个可视化的管理界面&#xff0c;帮助用户更轻松地管理和监控 k8s 集群&…

vscode使用Runner插件将.exe文件统一放到一个目录下

找到右下角管理&#xff0c;点击扩展。 找到Code Runner插件&#xff0c;打开扩展设置。 向下翻&#xff0c;找到Executor Map&#xff0c;点击在settings.json中编辑。 在c和c的配置命令栏中增加\\\output\\即可。&#xff08;增加的目录不能自动创建&#xff0c;需要手动创建…

基于大语言模型的云故障根因分析|顶会EuroSys24论文

*马明华 微软主管研究员 2021年CCF国际AIOps挑战赛程序委员会主席&#xff08;第四届&#xff09; 2021年博士毕业于清华大学&#xff0c;2020年在佐治亚理工学院做访问学者。主要研究方向是智能运维&#xff08;AIOps&#xff09;、软件可靠性。近年来在ICSE、FSE、ATC、EuroS…