《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于抽象工厂的迷宫

本文主要是介绍《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于抽象工厂的迷宫,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


示例:基于抽象工厂的迷宫  
  1. 实现:  
  2.    如果TMaze.Create是传递一个对象当作参数来建立rooms、walls及doors;如此你可以以不同的参数来改变rooms、walls及doors的类。  
  3. 请注意MazeFactory也就是工厂方法(Factory Method)的一个集合;这是最通常实现抽象工厂模式的方式。同时请注意MazeFactory不是一个抽象类(abstract class)它的行为包括抽象工厂(abstractFactory)及具体工厂(ContreteFactory);这也是另一种以抽象工厂实现简单应用系统的方式。因为MazeFactory是一种具体类包含所有的工厂方法所以容易以继承及覆盖的方式建立新的MazeFactory。  
  4. 代码:  
  5.    
  6.    
  7. unit uMazeFactory;  
  8.    
  9. interface  
  10.    
  11. uses  
  12.     Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls;  
  13.    
  14. type  
  15.     {房间的四个方向}  
  16.     TDirection = (North = 0,South = 1,East = 2,West = 3);  
  17.    
  18. const  
  19.     DirectionNames: array[TDirection] of string = ('北''南''东''西');  
  20.    
  21. type  
  22.     {咒语}  
  23.     TSpell = class  
  24.     private  
  25.         FKey: string;  
  26.     public  
  27.         property Key: string read FKey write FKey;  
  28.     end;  
  29.    
  30.     {迷宫构件}  
  31.     TMapSite = class  
  32.     private  
  33.         FStateMsg: string;  
  34.     public  
  35.         function Enter: Boolean; virtual; abstract;  
  36.         //---  
  37.         property StateMsg: string read FStateMsg write FStateMsg;  
  38.     end;  
  39.     {房间}  
  40.     TRoom = class(TMapSite)  
  41.     private  
  42.         FSides: array[TDirection] of TMapSite;  
  43.         FRoomNumber: Integer;  
  44.     protected  
  45.         function GetSides(Direction: TDirection): TMapSite;  
  46.         procedure SetSides(Direction: TDirection; const Value: TMapSite);  
  47.     public  
  48.         constructor Create(ARoomNumber: integer);  
  49.         destructor Destroy; override;  
  50.         //---  
  51.         function Enter: Boolean; override;  
  52.         //---  
  53.         property RoomNumber: Integer read FRoomNumber;  
  54.         property Sides[Direction: TDirection]: TMapSite read GetSides write SetSides;  
  55.     end;  
  56.     TRoomWithABomb = class(TRoom)  
  57.     private  
  58.         FBomb: boolean;  
  59.     public  
  60.         constructor Create(ARoomNumber: integer; Bombed: boolean = false);  
  61.         //---  
  62.         procedure Initialize1(Bombed: boolean);  
  63.         function HasBomb(): Boolean;  
  64.         function Enter: Boolean; override;  
  65.     end;  
  66.     TEnchantedRoom = class(TRoom)  
  67.     private  
  68.         FSpell: TSpell;  
  69.     public  
  70.         constructor Create(ARoomNumber: integer; Spell: TSpell = nil);  
  71.         destructor Destroy; override;  
  72.         //---  
  73.         function Enter: Boolean; override;  
  74.         //---  
  75.         function HasSpell(): boolean;  
  76.         function PickUpSpell(): TSpell;  
  77.     end;  
  78.     {墙壁}  
  79.     TWall = class(TMapSite)  
  80.     public  
  81.         function Enter: Boolean; override;  
  82.     end;  
  83.     TBombedWall = class(TWall)  
  84.     private  
  85.         FBomb: boolean;  
  86.     public  
  87.         constructor Create(Bombed: boolean = false);  
  88.         //---  
  89.         function Enter: Boolean; override;  
  90.         procedure Initialize1(Bombed: boolean);  
  91.     end;  
  92.     {门}  
  93.     TDoor = class(TMapSite)  
  94.     private  
  95.         FRoom1,FRoom2: TRoom;  
  96.         //--门是否开启  
  97.         FIsOpen: Boolean;  
  98.         procedure Initialize(room1,room2: TRoom);  
  99.     public  
  100.         constructor Create(room1,room2: TRoom); virtual;  
  101.         destructor Destroy; override;  
  102.         //---  
  103.         function Enter: Boolean; override;  
  104.         {从一个房间(传入参数)进入另一个房间(输出结果)}  
  105.         function OtherSideFrom(Room: TRoom): TRoom;  
  106.     end;  
  107.     TDoorNeedingSpell = class(TDoor)  
  108.     private  
  109.         FSpell: TSpell;  
  110.         function TrySpell(Spell: TSpell): boolean;  
  111.     public  
  112.         constructor Create(room1,room2: TRoom); override;  
  113.         destructor Destroy; override;  
  114.         //---  
  115.         function Enter: Boolean; override;  
  116.     end;  
  117.     TRoomList = class  
  118.     private  
  119.         FItemList: TList;  
  120.         function GetCount: Integer;  
  121.         function GetItems(Index: integer): TRoom;  
  122.     protected  
  123.         procedure Clear;  
  124.     public  
  125.         constructor Create;  
  126.         destructor Destroy; override;  
  127.         //---  
  128.         function Add(const Room: TRoom): integer;  
  129.         //---  
  130.         property Count: Integer read GetCount;  
  131.         property Items[Index: integer]: TRoom read GetItems;  
  132.     end;  
  133.    
  134.     {迷宫}  
  135.     TMaze = class  
  136.     private  
  137.         FRooms: TRoomList;  
  138.     public  
  139.         constructor Create;  
  140.         destructor Destroy; override;  
  141.         //---  
  142.         {在迷宫中加入一个房间}  
  143.         procedure AddRoom(Room: TRoom);  
  144.         {根据房间编号取得房间}  
  145.         function RoomNo(RoomNumber: Integer): TRoom;  
  146.     end;  
  147.     {迷宫构件工厂}  
  148.     TMazeFactory = class  
  149.     protected  
  150.         function MakeDoor(r1,r2: TRoom): TDoor; virtual;  
  151.         function MakeMaze: TMaze; virtual;  
  152.         function MakeRoom(ARoomNumber: integer): TRoom; virtual;  
  153.         function MakeWall: TWall; virtual;  
  154.     end;  
  155.     {炸弹迷宫构件工厂}  
  156.     TBombedMazeFactory = class(TMazeFactory)  
  157.     protected  
  158.         function MakeRoom(ARoomNumber: integer): TRoom; override;  
  159.         function MakeWall(): TWall; override;  
  160.     end;  
  161.     {魔法迷宫构件工厂}  
  162.     TEnchantedMazeFactory = class(TMazeFactory)  
  163.     private  
  164.         function CastSpell(): TSpell;  
  165.     protected  
  166.         function MakeRoom(ARoomNumber: integer): TRoom; override;  
  167.         function MakeDoor(r1,r2: TRoom): TDoor; override;  
  168.     end;  
  169.    
  170.     {迷宫游戏}  
  171.     TMazeGame = class  
  172.     public  
  173.         function CreateMaze(factory: TMazeFactory): TMaze;  
  174.     end;  
  175.    
  176. var  
  177.     CurSpell: TSpell;  
  178.    
  179. implementation  
  180.    
  181. constructor TRoom.Create(ARoomNumber: integer);  
  182.     //---  
  183.     procedure _InitSides;  
  184.     var  
  185.         Direction: TDirection;  
  186.     begin  
  187.         for Direction := Low(FSides) to High(FSides) do  
  188.             FSides[Direction] := nil;  
  189.     end;  
  190. begin  
  191.     inherited Create;  
  192.     //---  
  193.     FRoomNumber := ARoomNumber;  
  194.     //---  
  195.     _InitSides;  
  196. end;  
  197.    
  198. destructor TRoom.Destroy;  
  199.     //---  
  200.     procedure _ClearSides;  
  201.     var  
  202.         Direction: TDirection;  
  203.     begin  
  204.         for Direction := Low(FSides) to High(FSides) do  
  205.         begin  
  206.             if FSides[Direction] <> nil then  
  207.                 FSides[Direction].Free;  
  208.         end;  
  209.     end;  
  210. begin  
  211.     _ClearSides;  
  212.     //---  
  213.     inherited;  
  214. end;  
  215.    
  216. function TRoom.Enter: Boolean;  
  217. begin  
  218.     self.StateMsg := format('进入房间%d', [FRoomNumber]);  
  219.     Result := true;  
  220. end;  
  221.    
  222. function TRoom.GetSides(Direction: TDirection): TMapSite;  
  223. begin  
  224.     Result := FSides[Direction];  
  225. end;  
  226.    
  227. procedure TRoom.SetSides(Direction: TDirection; const Value: TMapSite);  
  228. begin  
  229.     FSides[Direction] := Value;  
  230. end;  
  231.    
  232. function TWall.Enter: Boolean;  
  233. begin  
  234.     self.StateMsg := '碰到墙';  
  235.     Result := false;  
  236. end;  
  237.    
  238. constructor TDoor.Create;  
  239. begin  
  240.     inherited Create;  
  241.     //---  
  242.     Initialize(room1,room2);  
  243. end;  
  244.    
  245. destructor TDoor.Destroy;  
  246.     //---  
  247.     procedure _ClearDoor(Room: TRoom);  
  248.     var  
  249.         Direction: TDirection;  
  250.     begin  
  251.         if Room <> nil then  
  252.         begin  
  253.             with Room do  
  254.             begin  
  255.                 for Direction := Low(TDirection) to High(TDirection) do  
  256.                 begin  
  257.                     if Sides[Direction] = self then  
  258.                     begin  
  259.                         Sides[Direction] := nil;  
  260.                         exit;  
  261.                     end;  
  262.                 end;  
  263.             end;  
  264.         end;  
  265.     end;  
  266. begin  
  267.     _ClearDoor(FRoom1);  
  268.     _ClearDoor(FRoom2);  
  269.     //---  
  270.     inherited;  
  271. end;  
  272.    
  273. function TDoor.Enter: Boolean;  
  274. begin  
  275.     self.StateMsg := '碰到门';  
  276.     Result := true;  
  277. end;  
  278.    
  279. procedure TDoor.Initialize(room1,room2: TRoom);  
  280. begin  
  281.     FRoom1 := room1;  
  282.     FRoom2 := room2;  
  283.     FIsOpen := False;  
  284. end;  
  285.    
  286. function TDoor.OtherSideFrom(Room: TRoom): Troom;  
  287. begin  
  288.     if Room = FRoom1 then  
  289.         Result := FRoom2  
  290.     else  
  291.         Result := FRoom1;  
  292. end;  
  293.    
  294. constructor TBombedWall.Create(Bombed: boolean);  
  295. begin  
  296.     inherited Create;  
  297.     //---  
  298.     Initialize1(Bombed);  
  299. end;  
  300.    
  301. function TBombedWall.Enter: Boolean;  
  302. begin  
  303.     if FBomb then  
  304.     begin  
  305.         self.StateMsg := '碰到炸弹墙';  
  306.         Result := false;  
  307.     end  
  308.     else  
  309.         Result := inherited Enter;  
  310. end;  
  311.    
  312. procedure TBombedWall.Initialize1(Bombed: boolean);  
  313. begin  
  314.     FBomb := Bombed;  
  315. end;  
  316.    
  317. constructor TDoorNeedingSpell.Create(room1,room2: TRoom);  
  318. begin  
  319.     inherited;  
  320.     //---  
  321.     FSpell := TSpell.Create;  
  322.     FSpell.Key := '123';  
  323. end;  
  324.    
  325. destructor TDoorNeedingSpell.Destroy;  
  326. begin  
  327.     FSpell.Free;  
  328.     //---  
  329.     inherited;  
  330. end;  
  331.    
  332. function TDoorNeedingSpell.Enter: Boolean;  
  333. begin  
  334.     Result := TrySpell(CurSpell);  
  335.     if Result then  
  336.         self.StateMsg := '碰到门,使用了正确的咒语卷轴'  
  337.     else  
  338.         self.StateMsg := '碰到门,使用了错误的咒语卷轴';  
  339. end;  
  340.    
  341. function TDoorNeedingSpell.TrySpell(Spell: TSpell): boolean;  
  342. begin  
  343.     Result := FSpell.Key = Spell.Key;  
  344. end;  
  345.    
  346. constructor TRoomWithABomb.Create(ARoomNumber: integer; Bombed: boolean);  
  347. begin  
  348.     inherited Create(ARoomNumber);  
  349.     //---  
  350.     Initialize1(Bombed);  
  351. end;  
  352.    
  353. function TRoomWithABomb.Enter: Boolean;  
  354. begin  
  355.     if HasBomb then  
  356.     begin  
  357.         self.StateMsg := format('进入有炸弹的房间%d', [FRoomNumber]);  
  358.         Result := true;  
  359.     end  
  360.     else  
  361.         Result := inherited Enter;  
  362. end;  
  363.    
  364. function TRoomWithABomb.HasBomb: Boolean;  
  365. begin  
  366.     Result := FBomb;  
  367. end;  
  368.    
  369. procedure TRoomWithABomb.Initialize1(Bombed: boolean);  
  370. begin  
  371.     FBomb := Bombed;  
  372. end;  
  373.    
  374. constructor TEnchantedRoom.Create(ARoomNumber: integer; Spell: TSpell);  
  375. begin  
  376.     inherited Create(ARoomNumber);  
  377.     //---  
  378.     FSpell := Spell;  
  379. end;  
  380.    
  381. destructor TEnchantedRoom.Destroy;  
  382. begin  
  383.     if FSpell <> nil then  
  384.         FSpell.Free;  
  385.     //---  
  386.     inherited;  
  387. end;  
  388.    
  389. function TEnchantedRoom.Enter: Boolean;  
  390. begin  
  391.     if HasSpell then  
  392.     begin  
  393.         CurSpell := PickUpSpell;  
  394.         self.StateMsg := format('进入房间%d,拿起咒语卷轴', [FRoomNumber]);  
  395.         Result := true;  
  396.     end  
  397.     else  
  398.         Result := inherited Enter;  
  399. end;  
  400.    
  401. function TEnchantedRoom.HasSpell: boolean;  
  402. begin  
  403.     Result := FSpell <> nil;  
  404. end;  
  405.    
  406. function TEnchantedRoom.PickUpSpell: TSpell;  
  407. begin  
  408.     Result := FSpell;  
  409. end;  
  410.    
  411. constructor TMaze.Create;  
  412. begin  
  413.     inherited;  
  414.     //---  
  415.     FRooms := TRoomList.Create;  
  416. end;  
  417.    
  418. destructor TMaze.Destroy;  
  419. begin  
  420.     FRooms.Free;  
  421.     //---  
  422.     inherited;  
  423. end;  
  424.    
  425. procedure TMaze.AddRoom(Room: TRoom);  
  426. begin  
  427.     FRooms.Add(Room);  
  428. end;  
  429.    
  430. function TMaze.RoomNo(RoomNumber: Integer): TRoom;  
  431. var  
  432.     i: Integer;  
  433. begin  
  434.     Result := nil;  
  435.     //---  
  436.     with FRooms do  
  437.     begin  
  438.         for i := 0 to Count - 1 do  
  439.         begin  
  440.             if Items[i].Roomnumber = RoomNumber then  
  441.             begin  
  442.                 Result := Items[i];  
  443.                 Exit;  
  444.             end;  
  445.         end;  
  446.     end;  
  447. end;  
  448.    
  449. function TMazeFactory.MakeDoor(r1,r2: TRoom): TDoor;  
  450. begin  
  451.     Result := TDoor.Create(r1,r2);  
  452. end;  
  453.    
  454. function TMazeFactory.MakeMaze: TMaze;  
  455. begin  
  456.     Result := TMaze.Create;  
  457. end;  
  458.    
  459. function TMazeFactory.MakeRoom(ARoomNumber: integer): TRoom;  
  460. begin  
  461.     Result := TRoom.Create(ARoomNumber);  
  462. end;  
  463.    
  464. function TMazeFactory.MakeWall: TWall;  
  465. begin  
  466.     Result := TWall.Create;  
  467. end;  
  468.    
  469. function TBombedMazeFactory.MakeWall(): TWall;  
  470. begin  
  471.     Result := TBombedWall.Create;  
  472. end;  
  473.    
  474. function TBombedMazeFactory.MakeRoom(ARoomNumber: integer): TRoom;  
  475. begin  
  476.     Result := TRoomWithABomb.Create(ARoomNumber);  
  477. end;  
  478.    
  479. function TEnchantedMazeFactory.MakeRoom(ARoomNumber: integer): TRoom;  
  480. begin  
  481.     Result := TEnchantedRoom.Create(ARoomNumber,CastSpell);  
  482. end;  
  483.    
  484. function TEnchantedMazeFactory.CastSpell(): TSpell;  
  485. begin  
  486.     Result := TSpell.Create;  
  487.     Result.Key := '123';  
  488. end;  
  489.    
  490. function TEnchantedMazeFactory.MakeDoor(r1,r2: TRoom): TDoor;  
  491. begin  
  492.     Result := TDoorNeedingSpell.Create(r1,r2);  
  493. end;  
  494.    
  495. function TMazeGame.CreateMaze(factory: TMazeFactory): TMaze;  
  496. var  
  497.     aMaze: TMaze;  
  498.     r1,r2: Troom;  
  499.     theDoor: TDoor;  
  500. begin  
  501.     //---建构一个maze,有两个Room,一个Door,六面Wall  
  502.     aMaze := factory.MakeMaze;  
  503.     //---  
  504.     r1 := factory.MakeRoom(1);  
  505.     r2 := factory.MakeRoom(2);  
  506.     //---  
  507.     theDoor := factory.MakeDoor(r1,r2);  
  508.     //---  
  509.     aMaze.AddRoom(r1);  
  510.     aMaze.AddRoom(r2);  
  511.     //---  
  512.     r1.SetSides(North,factory.MakeWall());  
  513.     r1.SetSides(East,theDoor);  
  514.     r1.SetSides(South,factory.MakeWall());  
  515.     r1.SetSides(West,factory.MakeWall());  
  516.     //---  
  517.     r2.SetSides(North,factory.MakeWall());  
  518.     r2.SetSides(East,factory.MakeWall());  
  519.     r2.SetSides(South,factory.MakeWall());  
  520.     r2.SetSides(West,theDoor);  
  521.     //---  
  522.     result := aMaze;  
  523. end;  
  524.    
  525. constructor TRoomList.Create;  
  526. begin  
  527.     inherited;  
  528.     //---  
  529.     FItemList := TList.Create;  
  530. end;  
  531.    
  532. destructor TRoomList.Destroy;  
  533. begin  
  534.     Clear;  
  535.     FItemList.Free;  
  536.     //---  
  537.     inherited;  
  538. end;  
  539.    
  540. function TRoomList.Add(const Room: TRoom): integer;  
  541. begin  
  542.     if Assigned(Room) then  
  543.         Result := FItemList.Add(Room)  
  544.     else  
  545.         Result := -1;  
  546. end;  
  547.    
  548. procedure TRoomList.Clear;  
  549. var  
  550.     i: Integer;  
  551. begin  
  552.     with FItemList do  
  553.     begin  
  554.         for i := 0 to Count - 1 do  
  555.             TObject(Items[i]).Free;  
  556.         //---  
  557.         Clear;  
  558.     end;  
  559. end;  
  560.    
  561. function TRoomList.GetCount: Integer;  
  562. begin  
  563.     Result := FItemList.Count;  
  564. end;  
  565.    
  566. function TRoomList.GetItems(Index: integer): TRoom;  
  567. begin  
  568.     Result := FItemList[Index];  
  569. end;  
  570.    
  571.    
  572. end.  
  573.    
  574. unit Unit2;  
  575.    
  576. interface  
  577.    
  578. uses  
  579.     Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,  
  580.     Dialogs,StdCtrls,uMazeFactory;  
  581.    
  582. type  
  583.     TForm2 = class(TForm)  
  584.         ListBox1: TListBox;  
  585.         procedure FormDestroy(Sender: TObject);  
  586.         procedure FormCreate(Sender: TObject);  
  587.         procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);  
  588.         procedure ListBox1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);  
  589.     private  
  590.         FMazeGame: TMazeGame;  
  591.         FMazeFactory: TMazeFactory;  
  592.         FMaze: TMaze;  
  593.         FCurRoom: TRoom;  
  594.     public  
  595.     { Public declarations }  
  596.     end;  
  597.    
  598. var  
  599.     Form2: TForm2;  
  600.    
  601. implementation  
  602.    
  603. {$R *.dfm}  
  604.    
  605. procedure TForm2.FormCreate(Sender: TObject);  
  606. begin  
  607.     self.KeyPreview := true;  
  608.     //---  
  609.     FMazeGame := TMazeGame.Create;  
  610.     //---  
  611.     {FMazeFactory := TMazeFactory.Create; 
  612.     FMaze := FMazeGame.CreateMaze(FMazeFactory); }  
  613.     //---  
  614.     FMazeFactory := TBombedMazeFactory.Create;  
  615.     FMaze := FMazeGame.CreateMaze(FMazeFactory);  
  616.     TRoomWithABomb(FMaze.RoomNo(2)).Initialize1(true);  
  617.     //---  
  618.     {FMazeFactory := TEnchantedMazeFactory.Create; 
  619.     FMaze := FMazeGame.CreateMaze(FMazeFactory);}  
  620.     //---  
  621.     FCurRoom := FMaze.RoomNo(1);  
  622.     with FCurRoom do  
  623.     begin  
  624.         Enter;  
  625.         ListBox1.Items.Add(StateMsg);  
  626.     end;  
  627. end;  
  628.    
  629. procedure TForm2.FormDestroy(Sender: TObject);  
  630. begin  
  631.     FMaze.Free;  
  632.     FMazeFactory.Free;  
  633.     FMazeGame.Free;  
  634. end;  
  635.    
  636. procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word; Shift:  
  637.     TShiftState);  
  638.     //---  
  639.     procedure _EnterRoomSide(Direction: TDirection);  
  640.     var  
  641.         ARoom: TRoom;  
  642.     begin  
  643.         with FCurRoom do  
  644.         begin  
  645.             if Sides[Direction] <> nil then  
  646.             begin  
  647.                 with Sides[Direction] do  
  648.                 begin  
  649.                     if Enter then  
  650.                     begin  
  651.                         ListBox1.Items.Add(DirectionNames[Direction] + ':' + StateMsg);  
  652.                         //---  
  653.                         if Sides[Direction] is TDoor then  
  654.                         begin  
  655.                             ARoom := TDoor(Sides[Direction]).OtherSideFrom(FCurRoom);  
  656.                             if ARoom <> nil then  
  657.                             begin  
  658.                                 if ARoom.Enter then  
  659.                                     FCurRoom := ARoom;  
  660.                                 ListBox1.Items.Add(ARoom.StateMsg);  
  661.                             end;  
  662.                         end;  
  663.                     end  
  664.                     else  
  665.                         ListBox1.Items.Add(DirectionNames[Direction] + ':' + StateMsg);  
  666.                 end;  
  667.             end;  
  668.         end;  
  669.     end;  
  670. begin  
  671.     case Ord(Key) of  
  672.         VK_LEFT: _EnterRoomSide(East);  
  673.         VK_RIGHT: _EnterRoomSide(West);  
  674.         VK_UP: _EnterRoomSide(South);  
  675.         VK_DOWN: _EnterRoomSide(North);  
  676.     end;  
  677. end;  
  678.    
  679. procedure TForm2.ListBox1KeyDown(Sender: TObject; var Key: Word; Shift:  
  680.     TShiftState);  
  681. begin  
  682.     Key := 0;  
  683. end;  
  684.    
  685. end.  

这篇关于《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于抽象工厂的迷宫的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1142328

相关文章

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

JavaScript Array.from及其相关用法详解(示例演示)

《JavaScriptArray.from及其相关用法详解(示例演示)》Array.from方法是ES6引入的一个静态方法,用于从类数组对象或可迭代对象创建一个新的数组实例,本文将详细介绍Array... 目录一、Array.from 方法概述1. 方法介绍2. 示例演示二、结合实际场景的使用1. 初始化二

C#中的 StreamReader/StreamWriter 使用示例详解

《C#中的StreamReader/StreamWriter使用示例详解》在C#开发中,StreamReader和StreamWriter是处理文本文件的核心类,属于System.IO命名空间,本... 目录前言一、什么是 StreamReader 和 StreamWriter?1. 定义2. 特点3. 用

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使

Java强制转化示例代码详解

《Java强制转化示例代码详解》:本文主要介绍Java编程语言中的类型转换,包括基本类型之间的强制类型转换和引用类型的强制类型转换,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录引入基本类型强制转换1.数字之间2.数字字符之间引入引用类型的强制转换总结引入在Java编程语言中,类型转换(无论

redis+lua实现分布式限流的示例

《redis+lua实现分布式限流的示例》本文主要介绍了redis+lua实现分布式限流的示例,可以实现复杂的限流逻辑,如滑动窗口限流,并且避免了多步操作导致的并发问题,具有一定的参考价值,感兴趣的可... 目录为什么使用Redis+Lua实现分布式限流使用ZSET也可以实现限流,为什么选择lua的方式实现